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”。
仅此而已。
我在玩 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”。
仅此而已。