Java继承场景下子类调用父类方法结果不符合预期问题咨询
Java继承相关问题解答
涉及代码
public class B { private int y ; public B(int y){ this.y = y; } public int gety(){ return y; } } public class C extends B{ int y,z; public C(int y, int z ){ super(y); this.z = z; } public int m3(){ System.out.println(gety()); return this.z*super.gety(); } } public class Main { public static void main(String[] args) { B b = new B(10); C c = new C(2,3); System.out.println(super.gety()); // 这行代码实际无法通过编译 System.out.println(c.m3()); } }
实际运行输出
10 2 6
疑问解答
为什么m3()返回结果是6而非预期的30
核心原因如下:
- 实例属性和具体对象绑定,不同对象的属性完全独立。
B b = new B(10)创建的是一个单独的B类实例,它的y值10仅属于这个b对象;C c = new C(2,3)是另一个完全独立的C类实例,两个对象在内存中互不关联,c实例不可能读取到b对象的属性值。 - 创建c实例时,构造方法中
super(y)传入的是第一个构造参数值2,这个值会被赋值给c实例内部持有的父类B私有属性y;c类中自定义的同名y属性从未被赋值,默认值为0,且全程没有被调用。 - m3()方法计算时,
this.z取的是c实例的z值3,super.gety()取的是c实例自身父类部分存储的y值2,乘积为6,自然不会得到和b对象属性计算的30。
关于main方法中super.gety()的打印值说明
首先明确Java语法规则:super关键字只能在非静态的实例方法、构造方法内部使用,它代表当前实例的父类视图。静态main方法是类级别的方法,不存在绑定的实例对象,直接写super.gety()无法通过编译。
从你给出的三行输出反推,你实际运行的代码第一行打印应为b.gety(),输出的10是b对象自身的y值,和c实例没有任何关系。如果调用c实例的gety()或者在c的实例方法里用super.gety(),永远只会拿到c初始化时传给父类的2,不可能获取到其他实例的10。
易混淆知识点
private修饰的类成员为类私有,子类无法直接继承访问,只能通过父类暴露的非私有方法获取对应值。- 子类定义和父类同名的字段时会发生字段隐藏,两个字段完全独立,不会像方法一样发生重写,访问到哪个字段取决于调用时的视图是子类还是父类。
- 所有实例属性都和具体对象绑定,不存在“继承父类属性后所有实例共用同一个值”的逻辑。
内容的提问来源于stack exchange,提问作者Mohamed Aziz
相关产品推荐
相关产品推荐

