简体   繁体   English

从其中调用 Overridden 方法时会发生什么?

[英]what happens when Calling Overridden method from with in it?

i was writing Rational class in java to do basic math operation and i want to override methods from Number class and Comparable interface .我在 java 中编写Rational class 来进行基本的数学运算,我想覆盖来自Number classComparable interface的方法。 i have done that for doubleValue & compareTo methods.我已经为doubleValuecompareTo方法做到了。

As we know that BigInteger class also extends Number class , so i am confused that which method is being called in doubleValue because i have already override doubleValue & compareTo and calling doubleValue with in doubleValue & compareTo with in compareTo .我们知道BigInteger class扩展Number class ,所以我很困惑在doubleValue中调用了哪个方法,因为我已经覆盖doubleValuecompareTo并在doubleValuecompareTo调用doubleValue and it's seems silly too.这似乎也很愚蠢。

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);
    }
}
public double doubleValue(){
    return numerator.doubleValue()/denominator.doubleValue();
}

numerator is a BigInteger so BigInteger.doubleValue() is being called. numeratorBigInteger所以BigInteger.doubleValue()被调用。 Same with denominator .denominator相同。 It does not matter that your class also happens to have a doubleValue() function.没关系,您的 class 也恰好有一个doubleValue() function。 numerator and denominator are a different class than your Rational class. numeratordenominator是不同于Rational class 的 class。

          Number
          /   \
BigInteger     Rational
    |              |
doubleValue   doubleValue

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM