假设我有以下类
class A{
public method(A a) {
System.out.println(3);
}
}
class B extends A{
public void method (A a) {
System.out.println(2);
}
public void method (B b) {
System.out.println(1);
}
}
A obj = new B();
obj.method( (B) obj);
((B) obj).method( (B) obj);
第一个方法调用打印出2,而第二个方法调用打印出1.为什么两个方法调用都不打印1?
答案 0 :(得分:4)
void method (B b)
对于其父A来说是完全未知的。
这是合乎逻辑的,因为在obj.method((B) obj);
中,obj
的类型是A,在多态性规则中它只能调用B类的void method(A a)
版本。
class B extends A {
// This is an overridden method visible to A
public void method(A a) {
System.out.println(2);
}
// This is an overloaded method unknown from A
public void method(B b) {
System.out.println(1);
}
}
You can read this SO answer which explained Override vs. Overload.
答案 1 :(得分:3)
因为java选择在编译时调用的方法。编译器只考虑作业的“左侧”。
因此,当您键入A obj = new B()
时,编译器只会“看到”类A
中的方法。
答案 2 :(得分:1)
第一个方法调用是使用类型A的对象引用完成的,因此可以调用相应的方法(可以重写)。
在第二种情况下,首先对B进行强制转换,因此在B类中定义相应的方法,即
method (B b)
被召唤。