Java方法调用重载逻辑

Max*_*ler 3 java jvm overloading

对于以下代码,为什么要打印A,B?我希望它能打印B,B.此外,JVM执行的方法调用是动态还是静态评估的?

public class Main {
    class A {

    }

    class B extends A {

    }

    public void call(A a) {
        System.out.println("I'm A");
    }

    public void call(B a) {
        System.out.println("I'm B");
    }


    public static void main(String[] args) {

        Main m = new Main();
        m.runTest();
    }

    void runTest() {
        A a = new B();
        B b = new B();

        call(a);
        call(b);
    }

}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 14

重载由编译器静态确定.覆盖是在执行时完成的,但这不是一个因素.

静态类型a是A,因此第一个方法调用被解析为call(A a).