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

Android Studio调试器输出解析:继承多态下属性修改异常问题

问题解析:Java字段隐藏导致的调试行为差异

核心原因:字段无多态性,存在字段隐藏

你遇到的问题本质是Java中的字段隐藏(Field Hiding):子类SecondClass定义的whoAmI字段并没有重写父类FirstClass的同名字段,而是在子类中重新创建了一个独立字段,与父类字段共存于同一个对象中。

代码执行细节拆解

  1. 对象创建与日志输出

    • 执行SecondClass test = new SecondClass();时,会先调用父类FirstClass的构造方法(输出FirstClass Constructor),再执行子类构造方法(输出SecondClass Constructor)。
    • 执行FirstClass tester= new FirstClass();时,仅调用父类构造方法(输出FirstClass Constructor)。
      最终日志输出顺序为:
    FirstClass Constructor
    SecondClass Constructor
    FirstClass Constructor
    
  2. 引用赋值与字段访问逻辑

    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:48:20