在类层次结构

时间:2017-01-10 20:51:12

标签: java

我试图用Java解决一个看起来很奇怪的方法调用问题,我希望有人可以帮忙解决这个问题。 这里是三个类的代码,A是继承自C的A和D继承的C的顶级类。

class A {
    int f(double x) {
        return 1;
    }

    int f(boolean x) {
        return 2;
    }
}

class C extends A {
    int f(double x) {
        return 3;
    }

    int f(int x) {
        return 4;
    }
} 

class D extends C {
    int f(double x) {
        return 5;
    }   

    int f(int x) {
        return 6;
    }

} 

public class test {
    public static void main(String[] args) {
        C b = new D();
        A d = new D();

        System.out.println(b.f(33));
        System.out.println(d.f(33));
    }
}

当我用int调用对象b的方法时,我得到6,这意味着调用来自D类的方法f(int x)。但是当我在对象d上调用相同的方法时,我得到5,这意味着调用来自D类的方法f(double x)。为什么它表现得那样?为什么一个整数在一种情况下被视为整数而在另一种情况下被视为一个整数?这与我如何宣布这两个对象有关,但我无法得到它。

1 个答案:

答案 0 :(得分:1)

区别在于对象的类型。 b的引用属于C类型,d的引用类型为A。在继承的情况下,JVM在运行时绑定方法,这意味着您只能调用引用类型的方法,但重写的方法是将运行的方法。

当您在d上调用该函数时,JVM会自动转换为double,因为A没有int参数的相应方法。然后,该方法向下移动到D,因为该对象是D的实例,但它仍然以double为单位。