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
。我对这个结果感到困惑。在main方法中,引用类型是Student
。因此,在执行s.printPerson()
时,它应该执行Student
的方法。关键是,在从超类继承的公共方法中,调用了哪个私有方法?为什么?
我认为在s.printPerson()
中,它会调用Student
的getInfo()
。但事实证明并非如此。IDE告诉我
private String getInfo(){
return "Student";
}
从未使用过。
有没有人能帮我一下?
发布于 2015-01-08 23:39:40
在Java中,private
methods are not inherited。
子类不继承父类的
private
成员。但是,如果超类具有用于访问其私有字段的公共或受保护的方法,则子类也可以使用这些方法。
您不能通过创建另一个getInfo
方法来覆盖getInfo
,因为它不是继承的。这就是为什么你的集成开发环境会给你一个“从未使用过”的警告,因为在Student
中没有任何东西使用它。调用来自Person
的getInfo
,因为它可用于Person
的printPerson
方法,所以输出Person
。
若要重写方法,该方法不能为private
。您可以将getInfo
包设置为私有(无访问修饰符)、protected
或public
。然后Student
将能够覆盖它。
发布于 2015-01-08 23:41:11
您可以使用private
修改器。这个修饰符意味着该方法只在类本身中可见,不能从其他类中看到,甚至不能从它的子类和超类中看到。因此,当您从类Person
调用getInfo()
时,惟一可见的方法是Person
类中定义的方法。实际上,这意味着在Java中不继承私有方法。
尝试将private
修饰符更改为protected
。然后,子类可以看到来自超类的方法,因此它们可以覆盖该方法。
https://stackoverflow.com/questions/27851516
复制相似问题