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()
中认为,它会调用getInfo()
的{{1}}。但事实证明并非如此。 IDE告诉我
Student
从未使用过。
有人可以帮我吗?
答案 0 :(得分:2)
在Java中,private
methods are not inherited。
子类不继承其父类的
private
成员。但是,如果超类具有访问其私有字段的公共或受保护方法,则子类也可以使用这些方法。
您无法通过创建其他getInfo
方法来覆盖getInfo
,因为它不会被继承。这就是为什么你的IDE给了你"从未使用过"警告,因为Student
中没有任何内容使用它。来自getInfo
的{{1}}被调用,因为它可用于Person
的{{1}}方法,因此会打印Person
。
要覆盖方法,它不能是printPerson
。您可以Person
包私有(无访问修饰符),private
或getInfo
。然后protected
将能够覆盖它。
答案 1 :(得分:2)
您使用private
修饰符。此修饰符意味着该方法仅在类本身内可见,而不是其他类,甚至不是其子类和超类。因此,当您从类getInfo()
调用Person
时,唯一可见的方法是Person
类中定义的方法。实际上,这意味着私有方法不会在Java中继承。
尝试将private
修饰符更改为protected
。然后子类可以从超类中看到该方法,因此它们可以覆盖该方法。