Android Studio调试器输出解析:继承多态下属性修改异常问题
问题解析:Java字段隐藏导致的调试行为差异
核心原因:字段无多态性,存在字段隐藏
你遇到的问题本质是Java中的字段隐藏(Field Hiding):子类SecondClass定义的whoAmI字段并没有重写父类FirstClass的同名字段,而是在子类中重新创建了一个独立字段,与父类字段共存于同一个对象中。
代码执行细节拆解
对象创建与日志输出
- 执行
SecondClass test = new SecondClass();时,会先调用父类FirstClass的构造方法(输出FirstClass Constructor),再执行子类构造方法(输出SecondClass Constructor)。 - 执行
FirstClass tester= new FirstClass();时,仅调用父类构造方法(输出FirstClass Constructor)。
最终日志输出顺序为:
FirstClass Constructor SecondClass Constructor FirstClass Constructor- 执行
引用赋值与字段访问逻辑
tester = test;后,tester是FirstClass类型的引用,但实际指向SecondClass实例。- Java中字段访问是编译期静态确定的,完全依据引用的静态类型(此处为
FirstClass),而非实际对象类型。因此执行tester.whoAmI = "DoingStuff";时,修改的是父类的whoAmI字段,而非子类的同名字段。
调试器现象解释
调试器展示的是SecondClass实例的子类字段whoAmI,而你修改的是父类的whoAmI字段,所以看起来子类字段没有变化。你可以在断点处添加表达式((FirstClass)tester).whoAmI,会看到父类字段已被修改为"DoingStuff"。
验证代码示例
若要验证该逻辑,可在代码末尾添加:
// 输出父类的whoAmI(已修改) System.out.println(tester.whoAmI); // 强制转为子类引用,输出子类的whoAmI(未修改) System.out.println(((SecondClass)tester).whoAmI);
进一步学习方向
- 重点区分字段隐藏和方法重写的差异:方法支持运行期动态绑定(多态),但字段仅由编译期静态类型决定访问目标。
- 查阅Java官方文档中关于继承的章节,深入理解字段隐藏的规则与影响。
内容的提问来源于stack exchange,提问作者Shaihi
相关产品推荐
相关产品推荐

