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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 08:40:41