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
相关产品推荐
相关产品推荐

