Java为什么upcasted对象会调用父类的方法实现?

Kay*_*y.Z 0 java inheritance overriding

我在处理 Java 类继承时遇到了一个问题,其中子类 C 有一个像其父类 A 一样的方法 fun() ,但签名不同。但是我不明白为什么在对象 x 上调用 fun() 时会调用父类的方法。我确实明白,因为签名不同,这并不完全是方法重写,但我仍然不明白为什么在这里调用 A 的 fun() 方法。

A级

class A{
    public void fun(double d){
        System.out.println("A");
    }
}
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 6

这里:

A x = new C();
Run Code Online (Sandbox Code Playgroud)

编译器只记住:x 属于 A 类。因此,当您这样做时:

x.fun(6); //prints "A"
Run Code Online (Sandbox Code Playgroud)

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

如果您想获得多态体验,请将foo()C 中的类型更改为采用 double,因此:使其成为真正的覆盖。或者将定义更改为C x = .... 然后它会打印“C”。

这就是全部内容。

  • 为了强调这一点,如果 C 也有第二个名为“fooBar()”的方法,您就不会期望能够在 A 的实例上调用它,即使具体类是 C。两个 fun() 方法具有相同的名称并不意味着它们是相同的方法。 (2认同)