【发布时间】:2015-02-26 22:53:06
【问题描述】:
为了理解静态绑定和动态绑定的区别,我实现了以下代码:
class A {
int met(A a) {
return 0;
}
int met(B b) {
return 1;
}
int met(C c) {
return 2;
}
}
class B extends A {
int met(A a) {
return 3;
}
int met(B b) {
return 4;
}
int met(C c) {
return 5;
}
}
class C extends B {
int f() {
return ((A)this).met((A)this);
}
}
public class Test {
public static void main(String[] args) {
C x = new C();
System.out.println(x.f());
}
}
我得到的结果是 3,但我不明白为什么,因为第一个演员是 A。
【问题讨论】:
-
一年中没有更好的时间开始学习Java吗?
-
为什么不呢?你期望会发生什么?
B覆盖该函数。 -
没有什么不好的时候开始学习 Java :))
-
嗯,是的,它覆盖了它,但演员表是针对 A 而不是 B。答案是它在继承线上自下而上的事实吗?换句话说,当我对超类 A 进行强制转换时,它需要 A 的最后一个孩子?
标签: java binding casting subclass superclass