让我们研究以下代码:

public class App {

    public static class A {

        public void doSmth3(long a) {
            System.out.println("This is doSmth3() in A...");
        }
    }

    public static class B extends A {

        public void doSmth3(int a) {
            System.out.println("This is doSmth3() in B...");
        }
    }

    public static void test(A a) {
        a.doSmth3(1);
    }

    public static void main(String[] args) {
       test(new B());
        new B().doSmth3(3);
    }

}


输出:

This is doSmth3() in A...
This is doSmth3() in B...


从我的角度来看,主要的2行应该提供相同的结果,但结果不同。

我的观点This is doSmth3() in A...应该输出twise,因为它过载。

请说明输出

最佳答案

简单:当Java编译器在a.doSmth3(1)中看到对test(A)的调用时,它只能将其编译为对A#doSmth3(long)的调用,这是唯一可用的方法。请注意,B#doSmth3(int)A#doSmth3(long)的重载,而不是替代。

09-26 09:57