【问题标题】:what happens when Calling Overridden method from with in it?从其中调用 Overridden 方法时会发生什么?
【发布时间】:2021-02-05 18:28:29
【问题描述】:

我在 java 中编写 Rational 类来做基本的数学运算,我想覆盖来自 数字类可比接口。我已经为 doubleValuecompareTo 方法做到了。

我们知道 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);
    }
}

【问题讨论】:

  • numeratordenominator 被声明为 BigIntegers 并定义为 BigIntegers,所以如果你在它们上调用方法,你就是在调用 BigInteger 的方法。你的类扩展什么并不重要。

标签: java class methods


【解决方案1】:
public double doubleValue(){
    return numerator.doubleValue()/denominator.doubleValue();
}

numerator 是一个BigInteger,所以BigInteger.doubleValue() 被调用。与denominator 相同。你的班级也恰好有一个doubleValue() 函数并不重要。 numeratordenominator 与您的 Rational 类是不同的类。

数字 / \ BigInteger 有理数 | | 双值双值

【讨论】:

  • 谢谢!!这有助于更好地理解。
猜你喜欢
  • 2022-06-17
  • 2012-03-08
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多