Java继承和方法重载

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类是抽象的,这就是为什么它不能被实例化,但我想了解这个结果的整个机制.

Era*_*ran 5

在编译时选择重载方法.从代码调用开始met((A) this),A选择带有类型参数的方法签名.

现在,在运行时,JVM必须决定met(A a)执行哪个方法.这由调用该方法的对象的运行时类型决定.因为你的对象是其延伸B,C型met(A a)B(它覆盖met(A a)A)被执行.