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); }
沿着链式调用逐段拆解接收者类型,就能清晰看到实际的调用目标:
this.subtract(r)执行当前Rational实例的减法计算,返回新生成的Rational对象.getNumerator()读取这个新Rational的分子属性,返回值为BigInteger类型- 最后链式的
.compareTo(...)调用的接收者是这个BigInteger类型的分子值,实际执行的是BigInteger类实现的compareTo逻辑,用来比较分子和0的大小
- 这里同样没有触发你重写的Rational版本的
compareTo(),不存在方法调用混乱的问题。
一个快速判断技巧:只要你看到方法调用前面点接的是BigInteger类型的变量、返回值,就完全不会跑到Rational类的同名方法里;只有当前面接的是Rational类型的对象(包括隐式的当前实例this),才会触发你重写的两个方法。
内容的提问来源于stack exchange,提问作者SidPro
相关产品推荐
相关产品推荐

