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

父类引用指向子类对象时,成员变量与方法访问结果为何不同?

为什么父类引用指向子类对象时,成员变量与方法的表现不一致?

问题场景代码

父类与子类定义

class Parent {
    int A = 0;

    void say() {
        System.out.println("Parent method");
    }
}

class Child extends Parent {
    int A = 1;
    int B = 3;

    void say() {
        System.out.println(A+B);
    }
}

测试执行代码

Parent obj = new Child();
System.out.println(obj.A); // 输出 0
obj.say();  // 输出 4

原因解析

Java对成员变量和成员方法的调用遵循完全不同的绑定规则:

  • 成员变量:编译期静态绑定
    编译阶段,编译器只会根据变量的声明类型(此处obj的声明类型是Parent)确定要访问的成员变量,和对象实际指向的子类实例无关。所以obj.A直接访问的是Parent类中定义的A,值为0。
    这里子类的int A = 1并不是覆盖父类的变量,而是隐藏了父类的同名变量——两者是两个独立的变量,只是名称相同。

  • 成员方法:运行期动态绑定
    对于非静态方法,Java采用动态绑定机制:运行时会根据对象的实际类型(此处obj实际指向Child实例)来调用对应的方法。因此obj.say()会执行Child中重写的say()方法,方法里的A是子类自身定义的变量(值为1),加上B=3,最终输出4。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:35:06