You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类打印为何输出抽象类私有成员?继承规则与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:49