子类重写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
相关产品推荐
相关产品推荐

