You need to enable JavaScript to run this app. Java Rational类开发:重写方法内部调用同名方法的疑问
优惠活动
大模型
产品
解决方案
定价
更多

Java Rational类开发:重写方法内部调用同名方法的疑问

方法调用实际指向的核心逻辑

你完全不用担心出现“调用自身重写方法形成递归”的问题,Java 实例方法的调用绑定规则非常明确:方法调用的执行入口,完全由调用点前面的接收者类型决定,和当前类有没有重写同名方法没有关系。

doubleValue() 方法内的调用

你在Rational类中重写的doubleValue()实现为:

@Override
public double doubleValue(){
    return numerator.doubleValue()/denominator.doubleValue();
}

这里出现的两个doubleValue()调用,接收者分别是类的私有成员numerator、denominator,二者的静态类型都是BigInteger:

  • 实际执行的是BigInteger类自带的doubleValue()逻辑,把存储的大整数转换为double类型
  • 完全不会触发你为Rational类重写的doubleValue(),不存在递归调用的问题
  • 对比你在longValue()方法中写的return (long)doubleValue():这里的调用没有显式标注接收者,默认是隐式的当前Rational实例(即this.doubleValue()),这部分才是真正调用你自己重写的Rational版本方法,属于方法复用的常规合理写法。

compareTo() 方法内的调用

你在Rational类中重写的compareTo()实现为:

@Override
public int compareTo(Rational r){
    return (this.subtract(r).getNumerator()).compareTo(BigInteger.ZERO);
}

沿着链式调用逐段拆解接收者类型,就能清晰看到实际的调用目标:

  1. this.subtract(r) 执行当前Rational实例的减法计算,返回新生成的Rational对象
  2. .getNumerator() 读取这个新Rational的分子属性,返回值为BigInteger类型
  3. 最后链式的.compareTo(...)调用的接收者是这个BigInteger类型的分子值,实际执行的是BigInteger类实现的compareTo逻辑,用来比较分子和0的大小
  • 这里同样没有触发你重写的Rational版本的compareTo(),不存在方法调用混乱的问题。

一个快速判断技巧:只要你看到方法调用前面点接的是BigInteger类型的变量、返回值,就完全不会跑到Rational类的同名方法里;只有当前面接的是Rational类型的对象(包括隐式的当前实例this),才会触发你重写的两个方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 20:45:04