这是我现在正在测试的一段代码,我注意到当我在Person中的getInfo()方法上将public更改为private时,Student()。printPerson()& Person()。printPerson()打印出“Person”。但是,当它公开时,会显示“学生”。有人可以解释一下吗?为什么private修饰符不允许从Student访问getInfo方法?
new Student().printPerson();
new Person().printPerson();
}
}
class Student extends Person {
public Student(){
System.out.println("student invoked") ;
}
public String getInfo() {
return "Student";
}
}
class Person {
public Person(){
System.out.println("person invoked");
}
private String getInfo() {
return "Person";
}
public void printPerson() {
System.out.println(getInfo());
}
答案 0 :(得分:5)
public
(或protected
)方法始终是虚拟。
这意味着如果派生类重写该方法,则通过基类进行的调用将调用派生类(如果该对象实际上是派生类的实例)。
当您的基本方法为public
时,会发生这种情况,并且从printPerson()
调用它会调用重写的派生版本。
当它是private
时,它不是虚拟的,所以来自基类的调用总是调用基本版本(因为它不知道派生类的方法)。