abstract 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 teste {
public static void main(String args[]) {
C x = new C();
System.out.println(x.f());
}
}
程序将返回 3,而我期望返回 0。为什么方法 f 中的第一个转换不执行任何操作,而第二个则有效?是因为在A类和B类中met方法被重载,因此使用静态绑定吗?
这就是多态性的工作方式。考虑一下这个例子:
A a = new C();
a.met(a);
正如预期的那样,这将调用正确的方法B#met(...)
。对象的方法表不会仅仅因为您更改存储的变量的类型而更改Object
中,因为之间的绑定Object
并且它的方法比存储类型和与其相关的方法之间的方法强。第二种类型有效,因为输入的类型被转换为A
因此该方法将其识别为A
(输入存储的类型比输入存储的类型具有更强的绑定Object
type).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)