Java中如何在父类方法内固定调用自身而非子类重写的方法?
问题:父类方法如何强制调用自身的方法而非子类重写版本
用户提供的代码示例(大写字母代表类型):
// 省略基准情况的递归函数 class A { X f1(Y y) { ... AA aa = this.f2(Z z); ... } AA f2(Z z) { ... X x = this.f1(Y y); ... } } class B extends A { @Override X f1(Y y) { ... AA aa = this.f2(Z z); ... } @Override AA f2(Z z) { ... AA aa = super.f2(Z z); X x = this.f1(Y y);... } }
调用new B().f2(z)时,A::f2内部会调用B::f1,希望找到特殊语法/关键字替代this,让A::f2始终调用A::f1,且不想重新实现相同函数。
解决方案
Java里没有专门的关键字能直接替代this来绕过多态,强制A::f2调用A::f1——因为this指向的是运行时实际实例(这里是B的实例),多态机制会优先触发子类的重写方法。
要避免重复代码同时实现需求,最合理的方式是把A::f1的核心逻辑抽成私有方法,让A::f2直接调用这个私有方法,而非可被重写的f1:
class A { // 对外暴露的可重写方法 X f1(Y y) { return doF1(y); } AA f2(Z z) { // 直接调用私有方法,确保执行A的核心逻辑 X x = doF1(Y y); ... } // 封装核心逻辑的私有方法,子类无法重写 private X doF1(Y y) { ... // 原来A::f1中的业务逻辑 } } class B extends A { @Override X f1(Y y) { ... AA aa = this.f2(Z z); ... // 可按需选择调用super.f1(y)或自定义逻辑 } }
这种方式既保留了子类重写f1的能力,又保证A::f2内部始终调用的是A自身的核心逻辑,完全无需重复代码。
内容的提问来源于stack exchange,提问作者Ray
相关产品推荐
相关产品推荐

