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

抽象父类方法中如何调用自身被重写的validate()方法?

让抽象父类方法调用自身被重写方法的解决方案

在你的代码中,由于Java的动态绑定机制,父类Parent的validate(int counter)里调用this.validate()时,实际会执行子类Child重写后的validate()方法,甚至会引发递归栈溢出问题。要让父类的validate(int)强制调用自身的validate()实现,最可靠的方案是封装私有核心方法:

方案:封装私有逻辑方法

将父类的验证逻辑抽离为一个私有方法,因为私有方法无法被子类重写,父类的所有相关方法都调用这个私有方法,就能确保执行的是父类原生逻辑。

修改后的Parent类代码如下:

abstract class Parent {
    protected boolean validate() {
        return validateInternal();
    }

    // 私有方法,封装父类原生验证逻辑,不受子类重写影响
    private boolean validateInternal() {
        System.out.println("In Parent");
        return true;
    }

    protected boolean validate(int counter) {
        // 直接调用私有方法,确保走父类自身的逻辑
        return validateInternal();
    }
}

原代码的问题解析

原代码中,Child的validate()调用了validate(1),而父类的validate(1)又通过this.validate()调用回Child的validate(),形成无限递归,运行时会抛出StackOverflowError。

修改后运行TT类的main方法,输出为:

In Child
In Parent

此时Child.validate()调用父类的validate(1),validate(1)执行父类的validateInternal()逻辑,不会再递归调用子类方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:12:14