为何子类继承的public方法无法调用子类的private方法?
printPerson()无法调用子类的private getInfo()? 首先看这段Java代码:
public class Test { public static void main(String[] args) { new Person().printPerson(); // 输出 Person new Student().printPerson(); // 输出 Person : Line 6 } } class Student extends Person { private String getInfo() // Line 11 { return "Student"; } } class Person { private String getInfo() { return "Person"; } public void printPerson() { System.out.println(getInfo()); } }
原解释提到第6行输出Person而非Student,是因为Student类的getInfo()是private的,仅能在Student内部调用。但疑问在于:
Person类的
printPerson()是public的,会被Student继承,那这个方法在Student类中可用,为何不能调用Student类的privategetInfo()?毕竟printPerson()和getInfo()都属于Student类(前者通过继承获得)。
核心要搞清楚Java中private方法的特性和继承方法的执行上下文:
private方法不参与继承和多态
Person类的getInfo()是private,它完全是Person类的私有成员,子类Student根本无法“看到”这个方法,更谈不上重写。Student里定义的privategetInfo(),是一个全新的、和父类毫无关系的方法,两者只是名字相同而已。继承的方法执行时,依然处于父类的上下文
Student继承了printPerson(),但这个方法的代码逻辑是在Person类中写的。当你调用new Student().printPerson()时,方法的执行逻辑还是按照Person类的代码来走——它只能访问Person类能看到的成员,也就是Person自己的privategetInfo(),根本不知道Student类里还有另一个getInfo()。private成员的访问范围严格限定在类内部
Student的privategetInfo(),只有Student类自己定义的代码才能调用。而printPerson()是从Person继承来的,它的代码属于Person类,不属于Student的内部代码,哪怕这个方法在Student实例上运行,也没有权限访问Student的private成员。
总结一句话:继承来的方法,本质还是父类的方法,只能用父类能访问到的东西,子类的private成员对它来说是完全不可见的。
内容的提问来源于stack exchange,提问作者Elias El hachem

