2015-01-08 4 views
2
public class Test { 
    public static void main(String args[]){ 
     Student s = new Student(); 
     s.printPerson(); 
    } 
} 

class Person{ 
    private String getInfo(){ 
     return "Person"; 
    } 
    public void printPerson(){ 
     System.out.println(getInfo()); 
    } 
} 

class Student extends Person{ 
    private String getInfo(){ 
     return "Student"; 
    } 
} 

Выходной сигнал Person. Я смущен этим результатом. В основном методе ссылочный тип: Student. Поэтому при выполнении s.printPerson() он должен выполнить метод Student. Ключевым моментом является то, что в общедоступном методе, унаследованном от суперкласса, какой частный метод вызывается? И почему?Java: Открытый метод, унаследованный от суперкласса, вызывает частный метод.

Я думал в s.printPerson(), он вызывает getInfo() от Student. Но это не так. IDE сообщает мне

private String getInfo(){ 
     return "Student"; 
} 

не используется.

Может ли кто-нибудь помочь мне с этим, пожалуйста?

+0

Если я вызываю 'getInfo()' из класса 'Person', я понимаю, что он выводит« Person ». Но в моем коде я вызываю 'getInfo()' из класса 'Student', а не' Person'. Я вызываю 'getInfo()' из 'Student', он, кажется, вызывает' printPerson() 'метод' Person', а не 'Student'. Я смущен этой проблемой. – RogerS

+0

Я немного модифицирую код. Я переопределяю 'getInfo()' в 'Student' с точно таким же кодом в' Person'. Теперь выход «Студент». Меня интересует механизм наследования методов. Я думал, что вывод должен быть таким же, потому что, если я переопределяю 'getInfo()' или нет, содержимое метода будет таким же, поэтому вывод должен быть тем же. Кто-нибудь может мне помочь? большое спасибо. – RogerS

ответ

1

В Java, private methods are not inherited.

Подкласс не наследует членов своего родительского класса private. Однако, если суперкласс имеет общедоступные или защищенные методы для доступа к своим закрытым полям, они также могут использоваться подклассом.

Вы не можете переопределить getInfo путем создания другой getInfo метод, поскольку он не унаследовал. Вот почему ваша IDE дала вам предупреждение «никогда не использовалось», потому что ничего в Student не использует. getInfo от Person вызывается, поскольку он доступен для PersonprintPerson, поэтому Person печатается.

Чтобы переопределить метод, он не должен быть private. Вы можете сделать getInfo package-private (без модификатора доступа), protected, или public. Тогда Student сможет переопределить его.

2

Вы используете модификатор private. Этот модификатор означает, что метод доступен только внутри самого класса, а не других классов, даже не его суб- и суперклассов. Поэтому, когда вы вызываете getInfo() из класса Person, единственным видимым методом является метод, определенный в классе Person. Эффективно это означает, что частные методы не наследуются в Java.

Попробуйте изменить модификатор private на protected. Затем подклассы могут видеть метод из суперкласса, и поэтому они могут переопределить метод.

+0

Я думаю, что метод из подкласса никогда не отображается в его суперклассе (не только для частных методов). Я ошибаюсь? –

+0

Благодарим вас за ответ. Я все еще не понимаю. Я вызываю метод 'getInfo()' класса 'Student' не' Person'. Должно ли оно вызывать 'printPerson()' класса 'Student'?Более подробная информация содержится в комментариях к оригинальному сообщению. Спасибо. – RogerS

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