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
相关产品推荐
相关产品推荐

