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方法是重载的,因此使用静态绑定?
答案 0 :(得分:1)
这就是多态性的工作方式。请考虑这个例子:
A a = new C();
a.met(a);
这将按预期调用正确的方法B#met(...)
。对象的方法表不会因为您更改Object
所存储的变量的类型而发生变化,因为Object
及其方法之间的绑定是比存储类型和与之相关的方法之间的更强。第二种类型有效,因为输入的类型被转换为A
,因此方法将其识别为A
(输入存储的类型具有比Object
类型更强的绑定)。