抽象父类方法中如何调用自身被重写的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
相关产品推荐
相关产品推荐

