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

Java中子类存在同名字段时调用继承的get方法为何返回父类字段值?

现象核心成因:Java对字段和方法的绑定规则完全割裂
  • Java的成员方法支持动态绑定:也就是大家熟知的多态机制,方法调用会在运行期根据对象的实际类型,选择匹配的重写版本,和引用的静态类型无关。
  • Java的成员字段是静态绑定:从设计层面就不参与多态机制,对字段的引用关系会在编译期就被完全锁死,运行时不会再根据对象的实际类型做动态查找。

套入这段示例代码的逻辑拆解:

  1. 子类Child只是定义了一个和父类同名的money字段,并没有重写父类的getMoney()方法。所以调用c.getMoney()时,实际执行的是Parent类中定义的那个继承来的方法,不存在动态绑定切换实现的可能。
  2. 哪怕把方法里的返回值改成return this.money,因为这个方法的代码是写在Parent类的作用域里的,编译期就已经把this.money的引用解析成了Parent类中定义的money字段——子类中定义的同名字段只是对父类字段做了“遮蔽”,这种遮蔽和方法的重写不是同一套机制,运行时对字段的访问不会再做动态查找,自然就返回了父类的10000,不会去读取子类里定义的同名遮蔽字段。

这和Python的行为差异本质是设计逻辑的不同:
Python所有的属性查找都是运行时动态完成的,即使方法定义在父类中,执行到访问self.money的语句时,会沿着当前实例的属性链从最具体的类开始逐层查找,找到子类中定义的money就会直接返回,不会像Java那样在编译期就把字段访问的目标固定死在方法所属的类上。

如果想要让这段代码返回子类定义的5000,只需要在Child类中重写getMoney()方法即可:当方法的定义归属到Child类后,方法作用域内的this.money就会在编译期被解析为Child类自身定义的money字段,再配合方法的动态绑定特性,调用时就会返回子类的字段值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 00:57:05