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)
这里:
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”。
这就是全部内容。