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

Java Android中函数返回子类却调用父类属性问题如何解决

问题解决说明

问题根源

Java 中只有非静态成员方法支持运行时多态,成员变量(无论静态/实例)、静态方法都没有重写特性,只会在编译期根据变量的声明类型绑定值:

  • 你当前把name定义为静态常量,子类的name只是隐藏了父类的同名字段,不属于重写
  • getButtonPos方法的返回值声明类型是父类Button,所以编译阶段就已经确定取父类的name值,和运行时实际返回的子类实例无关

解决方案1:用实例方法实现多态(最推荐)

把静态字段替换为实例方法,子类重写该方法,利用方法的多态特性取对应值:

修改后的类定义

public static class Button {
    // 去掉静态name字段,改为实例方法
    public String getName() {
        return "test";
    }
    // 其余原有逻辑保持不变
}

public static class Button1 extends Button {
    // 重写父类的getName方法
    @Override
    public String getName() {
        return "name 1";
    }
    // 其余原有逻辑保持不变
}

public static class Button2 extends Button {
    @Override
    public String getName() {
        return "name 2";
    }
    // 其余原有逻辑保持不变
}

调用方式调整

把原来直接取属性的写法改为调用实例方法:

printf(getButtonPos(1).getName()); // 输出结果为 name 1,符合预期

解决方案2:强制类型转换(不推荐,仅作了解)

如果不想改动原有类的结构,可以在拿到返回值后强制转换为对应的子类类型,再读取name属性:

// 确认返回的是Button1实例时再进行强转
printf(((SettingsAdapter.Button1)getButtonPos(1)).name); // 输出结果为 name 1

该方案需要提前判断返回的子类类型,完全失去了多态的灵活性,仅适合临时兼容场景使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:06:02