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,因为an Object和它的方法之间的绑定比存储类型和与其相关的方法之间的绑定更强大。第二种类型起作用,因为输入的类型被强制转换为该类型,A因此该方法将其识别为A(输入存储的Object类型比该类型具有更强的绑定)。
B#met(...)
Object
A