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

Java中super赋值父类实例变量后输出差异问题咨询

为什么Java代码中第10行和第12行输出不同?

代码示例

public class A {
    public int i = 1;
}

public class B extends A {
    int i = 2;
    public void print() {
        super.i = 3;
        A obj = new B();
        System.out.println(obj.i); // 输出1
        System.out.println(this.i); // 输出2
        System.out.println(super.i); // 输出3
    }

    public static void main(String [] args) {
        new B().print();
    }
}

运行输出

1
2
3

核心原因解释

Java中成员变量不支持多态特性,子类的同名成员变量只会隐藏父类变量,而非重写,访问时遵循明确的规则:

  • 第8行super.i = 3:这里的super指向的是当前调用print()方法的B实例的父类部分,修改的是这个特定实例的父类成员i,将其从初始值1改为3。

  • 第9行A obj = new B():这是向上转型,obj的编译类型是A,运行类型是B。但因为成员变量无多态,编译阶段就会确定访问编译类型(A类)的i。而这个obj是全新创建的B实例,它的父类部分i是默认初始化值1(和之前修改的那个B实例完全独立,无任何关联),所以第10行输出1。

  • 第12行super.i:这里的super依然指向当前调用print()的那个B实例的父类部分,也就是第8行被修改为3的i,所以输出3。

你之前的误解点在于:新创建的B实例(转型为A类型)是独立对象,它的父类成员变量不会继承之前实例的修改结果,两者完全无关。

内容的提问来源于stack exchange,提问作者Ryannnnnnnnn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 21:41:03