nab*_*bil 33 java overloading covariance
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
}
Run Code Online (Sandbox Code Playgroud)
你能解释一下最后一行的错误输出,为什么不是真的?
Jon*_*eet 59
你能解释一下最后一行的错误输出吗,为什么不是真的?
编译时类型ab是A,所以编译器 - 执行重载决策 - 确定唯一有效的方法签名f(A a),因此它调用它.
在执行时,执行该方法签名是B.f(A a)因为B它会覆盖它.
始终记住在编译时选择签名(重载),但在执行时选择实现(覆盖).
| 归档时间: |
|
| 查看次数: |
1323 次 |
| 最近记录: |