Java 为什么向上转型的对象会调用父类的方法实现?

Java why does upcasted object call parent's method implementation?

我在玩 Java class 继承时遇到了一个问题,其中 subclass C 有一个方法 fun() 与其父 A 类似,但签名不同。但是我不明白为什么在对象 x 上调用 fun() 时调用父 class 的方法。我明白因为签名不同所以这不完全是方法覆盖,但我仍然不明白为什么这里调用 A 的 fun() 方法。

class一个

class A{
    public void fun(double d){
        System.out.println("A");
    }
}

class C

public class C extends A{
    public static void main(String[] args){
        A x = new C();
        x.fun(6); //prints "A"
    }
    public void fun(int i){
        System.out.println("C");
    }
}

这里:

A x = new C();

编译器只记住:x是classA的。 所以当你这样做时:

x.fun(6); //prints "A"

它查找A中存在的方法,只有一个名为fun()的方法,而且那个取了double。因此,编译器将 fun(double) 的方法调用放入字节码中。稍后,在运行时,x 也有一个采用 int 的方法这一事实并不重要。因为在编译时,fun(double) 可以说是“固定”了。

如果你想获得多态体验,将C中foo()的类型更改为取双倍,所以:使它成为true 覆盖。或者将定义更改为 C x = ...。然后它会打印“C”。

仅此而已。