当前位置: 首页 > 知识库问答 >
问题:

从中调用重写方法时会发生什么?

卢深
2023-03-14

我用java编写Rational类来做基本的数学运算,我想覆盖Number类和Comparable接口的方法。我这样做是为了双倍的价值

正如我们所知,BigInteger类也扩展了数字类,所以我对在doubleValue中调用哪个方法感到困惑,因为我已经覆盖了doubleValue

import java.math.BigInteger;
class Rational extends Number implements Comparable<Rational>{

    // Data fields for numerator and denominator
    private BigInteger numerator = BigInteger.ZERO;
    private BigInteger denominator = BigInteger.ONE;

    // Construct a rational with default properties
    Rational(){
        numerator = BigInteger.ZERO;
        denominator = BigInteger.ONE;
    }
    Rational(BigInteger numerator,BigInteger denominator){
        BigInteger gcde = numerator.gcd(denominator);
        BigInteger temp = BigInteger.valueOf( (long)(denominator.compareTo(BigInteger.ZERO)) );
        this.numerator =  temp.multiply(numerator.divide(gcde));
        this.denominator = (denominator.abs()).divide(gcde);
    }
    
    // subtract a rational number to this rational a/b - r.a/r.b = a*r.b - r.a*b/r.b*b
    public Rational subtract(Rational r){
        BigInteger n = (numerator.multiply(r.getDenominator())).subtract(denominator.multiply(r.getNumerator())); 
        BigInteger d = denominator.multiply(r.getDenominator());
        return new Rational(n,d);
    }
    // Return numerator
    public BigInteger getNumerator(){
        return numerator;
    }
    // Return denominator
    public BigInteger getDenominator(){
       return denominator;
    }
    @Override // Implement the abstract doubleValue method in Number
    public double doubleValue(){
        return numerator.doubleValue()/denominator.doubleValue();
    }
    @Override // Implement the abstract longValue method in Number
    public long longValue(){
        return (long)doubleValue();
    }
    @Override
    public int compareTo(Rational r){
        return (this.subtract(r).getNumerator()).compareTo(BigInteger.ZERO);
    }
}

共有1个答案

卢俭
2023-03-14
public double doubleValue(){
    return numerator.doubleValue()/denominator.doubleValue();
}

分子是一个 BigInteger,因此调用 BigInteger.doubleValue()。 分母相同。你的类也恰好有一个doubleValue()函数并不重要。分子分母Rational 类是不同的类。

          Number
          /   \
BigInteger     Rational
    |              |
doubleValue   doubleValue
 类似资料: