Vla*_*lad 7 java inheritance overriding overloading
我试过执行以下代码:
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 fun() {
return ((A) this).met((A) this);
}
}
class Test {
public static void main(String[] args) {
C x = new C();
System.out.println(x.fun());
}
}
Run Code Online (Sandbox Code Playgroud)
输出为"3".
有人可以更详细地解释这个结果背后的理论概念.
我知道A类是抽象的,这就是为什么它不能被实例化,但我想了解这个结果的整个机制.
在编译时选择重载方法.从代码调用开始met((A) this),A选择带有类型参数的方法签名.
现在,在运行时,JVM必须决定met(A a)执行哪个方法.这由调用该方法的对象的运行时类型决定.因为你的对象是其延伸B,C型met(A a)的B(它覆盖met(A a)的A)被执行.