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

子类重写Object的finalize方法为何被调用?为何父子类方法均执行?

关于重写finalize方法后子类方法被调用的原因

首先明确一个关键点:你的代码中仅子类Person的finalize()方法被执行了,父类Object的finalize()并没有被调用——因为你在子类重写时没有显式调用super.finalize()。

核心原因:Java的方法重写(Override)机制

这是Java动态多态的典型表现,具体逻辑如下:

  • 所有Java类默认继承自Object,当Person类重写了Object的finalize()方法后,JVM会通过动态绑定机制,在调用该方法时优先匹配子类的实现——只要调用对象是子类实例,就会执行子类的方法。
  • 当System.gc()触发垃圾回收时,JVM检测到Person实例已无引用,便会调用该实例的finalize()方法,自然执行的是Person类中重写后的逻辑。

关于“父类方法是否会执行”的补充

Object类的finalize()是一个空实现(无任何业务逻辑)。如果希望父类的finalize()也被执行,需要在子类方法中显式调用父类实现:

@Override
public void finalize() throws Throwable{
    super.finalize(); // 调用父类Object的finalize方法
    System.out.println("Garbage collected --->" + this);
}

只有加上这行代码,父类的finalize()才会被执行(不过它本身没有实际逻辑,不会产生额外输出)。

对你猜测的验证

你的猜测完全正确:当子类与父类存在符合重写规则的同名方法,且调用对象是子类实例时,子类的方法优先级更高,会被优先执行——这正是Java多态特性的核心体现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:35:28