【发布时间】:2021-02-05 18:28:29
【问题描述】:
我在 java 中编写 Rational 类来做基本的数学运算,我想覆盖来自 数字类和可比接口。我已经为 doubleValue 和 compareTo 方法做到了。
我们知道 BigInteger 类 也扩展 Number 类,所以我很困惑 doubleValue 中调用了哪个方法 因为我已经 override doubleValue & compareTo 并在 doubleValuedoubleValue /em> & compareTo with in compareTo。而且看起来也很傻。
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);
}
}
【问题讨论】:
-
numerator和denominator被声明为BigIntegers 并定义为BigIntegers,所以如果你在它们上调用方法,你就是在调用BigInteger的方法。你的类扩展什么并不重要。