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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:06:32