子类打印为何输出抽象类私有成员?继承规则与toString解析
为什么子类对象能打印父类的私有成员值?
先把你的代码和输出结果放出来,方便大家对照:
抽象父类代码
public abstract class absclass { private int x,y; public absclass(int x,int y) { // TODO Auto-generated constructor stub this.x=x; this.y=y; } @Override public String toString() { // TODO Auto-generated method stub return new String(x+" --------- "+y); } }
子类代码
public class pc extends absclass { public pc(int x,int y) { // TODO Auto-generated constructor stub super(x, y); // x=x; // y=y; } public void compute() { System.out.println("well this is pc"); System.out.println(this); //for y=1; } }
主方法代码
public static void main(String[] args) { // TODO Auto-generated method stub new pc(0, 2).compute(); }
运行输出
0 --------- 2
这是个很经典的继承误区,我来给你掰扯清楚核心原因:
1. 子类对象包含父类的实例部分,但无权直接访问私有成员
当你创建pc对象时,JVM会先调用父类absclass的构造方法,初始化父类的实例区域——这里面就包含了私有变量x和y。这些变量确实存在于子类对象里,但子类代码不能直接读写它们(比如你注释掉的x=x;如果去掉注释,编译器肯定会报错)。
2. 你调用的toString()是父类的public方法,它有权访问自己的私有成员
子类pc没有重写toString()方法,所以执行System.out.println(this);时,实际上调用的是父类absclass继承过来的toString()方法。而父类的方法属于父类本身,它完全有权限访问自己的私有成员x和y,自然就能把它们的值拼接成字符串输出了。
简单说就是:子类碰不到父类的私有变量,但可以通过继承来的父类方法,让父类自己去读取这些变量并返回结果——就像你有个带锁的箱子,你打不开,但可以让箱子的主人(父类)帮你把里面的东西拿出来展示~
内容的提问来源于stack exchange,提问作者yolob 21
相关产品推荐
相关产品推荐

