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
类型更强的绑定)。