class A {
boolean f(A a) { return true; }
}
class B extends A {
boolean f(A a) { return false; } // override A.f(A)
boolean f(B b) { return true; } // overload A.f
}
void f() {
A a = new A();
A ab = new B();
B b = new B();
ab.f(a); ab.f(ab); ab.f(b); //(1) false, false, *false*
b.f(a); b.f(ab); b.f(b); //(2) false, false, true
}
你能解释一下第一行最后一个假输出,为什么不是真的吗?
最佳答案
can you please explain the first line last false output, why it is not true?
ab
的编译时类型是 A
,因此执行重载解析的编译器确定唯一有效的方法签名是 f (A a)
,所以它叫它。
在执行时,该方法签名作为B.f(A a)
执行,因为B
会覆盖它。
始终记住,签名是在编译时选择的(重载),而实现是在执行时选择的(覆盖)。
关于java - Java中的协方差和重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11625049/