2015-10-16 3 views
-2

One.javaНаследование и государственные/частные методы

public class One { 

    private void run() { 
     System.out.println("one"); 
    } 

    public void start() { 
     this.run(); 
    } 
} 

Two.java

public class Two extends One { 
    public void run() { 
     System.out.println("two"); 
    } 
} 

Main.java

public class Main { 
    public static void main(String[] args) { 
     Two t = new Two(); 
     t.start(); 
    } 
} 

Выход: один

Но если я объявляю run метод public в классе One, я получаю «два» в качестве вывода.

Это довольно непредсказуемо, как это работает?

+6

Когда '' '' '' '' '' ' 'метод является закрытым,' Two' не может получить к нему доступ. Когда это 'public', версия в' Two' переопределяет его. – JonK

+0

@JonK вы не можете переопределить частный метод – ControlAltDel

+0

@ControlAltDel Я не сказал, что мог. – JonK

ответ

6

метод run в Two не будет переопределение метода private в One, потому что это private и недоступным для любого класса вне One.

После того, как метод отмечен как public, система наследования имеет место, и run вызывается из start в One (как метод не переопределяется), а потом решить динамически (во время выполнения), как Two «ы run.

Мой совет, используйте аннотацию @Override, чтобы убедиться, что во время компиляции метод должным образом переопределен.

Кроме того, вы, кажется, играет с start и run методами: помните, что вам нужно extend Thread или implement Runnable для виртуальной машины Java, чтобы научиться распознавать классы как Runnable с.

+0

, но почему в частном случае 'this.run()' выдавать свой метод Один, а не два, потому что 'this' в объекте' Two' не ' One' – codegasmer

+2

@codegasmer http://stackoverflow.com/questions/5378995/confused-with-java-overriding-the-access-level –

0

Поскольку run является приватным в одном, он не связан динамически и не наследуется. Работать в двух не перекрывает проход в одном

1

В Java методы private: NOT видны подклассам. Protected методы ARE.

В классе Two вы сделали не переопределить метод start(), поэтому t.start() использует One.start(), который вызывает One.run(), который печатает «один».

Если изменить метод run() к public или protectedTwo класс переопределяет его и вызов t.start() будет в конечном итоге вызов версии, объявленной в Two.

В "блок-схема алгоритма" формы:
Когда run является private

Two.start() -> не определен! -> перейти к суперклассу -> One.start() -> run() -> One.пробег()

Когда run является public или protected

Two.start() -> не определен! -> перейти в суперкласс -> One.start() -> run() -> run() переопределяется подклассом -> перейти к подклассу -> Two.run()

Смежные вопросы