对一下代码的输出结果很有疑问。请懂得的人指教。
public class Test {
public static void main(String[] args) {
new Person().printPerson();
new Student().printPerson();
}
}
class Student extends Person {
private String getInfo() {
return "student";
}
}
class Person {
private String getInfo() {
return "person";
}
public void printPerson() {
System.out.println(getInfo());
}
}
输出结果是:personperson
为什么会这样?Student的实例调用printPerson()方法,为什么没有输出“student”?
3 回答
眼眸繁星
TA贡献1873条经验 获得超9个赞
我自己已经在知道了。
主类中Student的实例,调用printPetson方法是不能调用Student自己的getInfo方法的,因为getInfo方法是私有方法,不能直接调用。
而父类Person的GetInfo方法虽然是私有的,但是通过其公共的printPerson方法可以直接访问。
所以Student的实例调用printPerson方法,会调用与此方法同属一个类的私有getInfo方法。
陪伴而非守候
TA贡献1757条经验 获得超8个赞
嗯 没错 当你student调用时 printperson()时候,jvm 根据invokevirtual 找到了父类的实现。然后调用getinfo时候,此时穿入得this 虽然实际是student 但类型是Person 然后发现是private 直接invokespecial 调用,不用多态了
添加回答
举报
0/150
提交
取消