Java转换为超类并调用重载方法

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(xf()); } } 

该程序将返回3并且我期待0.为什么方法f中的第一个演员什么都不做而第二个演奏有效? 是因为在A和B类中,met方法是重载的,因此使用静态绑定?

这就是多态性的工作方式。 试试这个例子:

 A a = new C(); a.met(a); 

这将按预期调用正确的方法B#met(...) 。 对象的方法表不仅会改变,因为您更改了存储Object的变量的类型,因为Object和它的方法之间的绑定比存储类型和相关方法之间的绑定更强。它。 第二种类型有效,因为输入的类型被转换为A ,因此该方法将其识别为A (输入存储的类型具有比Object类型更强的绑定)。