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

Java中子类调用getName()返回父类变量?如何改用子类变量?

问题原因与修复方案

错误原因

Java中成员变量不具备多态特性,子类定义与父类同名的name变量,只是对父类变量的隐藏(Hide),而非方法那样的重写(Override)。

父类的getName()方法属于父类成员,方法内的this.name在编译阶段就已经绑定到父类的name变量。哪怕是通过子类对象调用这个方法,由于方法本身没有被子类重写,执行的还是父类的方法逻辑,自然返回父类的name值。

修复方法

方法1:重写子类的getName()方法

在子类中重写getName(),让它返回子类自己的name变量:

class Child extends Parent {
    public String name = "child";

    @Override
    public String getName() {
        return this.name;
    }
}

此时调用child.getName()时,由于多态机制,会执行子类重写后的方法,返回子类的name值。

方法2:避免变量隐藏,通过构造方法修改父类变量

不在子类中定义同名变量,而是通过父类构造方法初始化name:

class Parent {
    public String name = "parent";

    // 新增带参构造方法
    public Parent(String name) {
        this.name = name;
    }

    // 保留无参构造
    public Parent() {}

    public String getName() {
        return this.name;
    }
}

class Child extends Parent {
    public Child() {
        // 调用父类构造方法,修改父类的name值
        super("child");
    }
}

这种方式避免了变量隐藏的问题,子类对象的name本质是父类的成员变量,调用getName()自然返回修改后的值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:10:32