2

我对java中的方法调度感到困惑。为什么第一个方法“a.m1(b)”调用类A?

调用变量是 a。它的运行时类型是 B,不是吗?

class A {
    public void m1(A a){
        System.out.println("A-m1");
    }
    public void m1(){
        System.out.println("A-m1");
    }

}
class B extends A {
    public void m1( B b){
        System.out.println("B-m1");

    }
    public void m1(){
        System.out.println("B-m1");

    }

}
public class HelloWorld {
    public static void main(String[] args) {

    B b = new B();  
    A a = new B();

        a.m1(b);//prints A-m1
        a.m1();//prints B-m1

    }

}
4

1 回答 1

7

重载解析是基于编译时类型完成的。类型的变量A仅公开方法m1()m1(A). 因为你传入了一个参数,m1(A)所以被调用;或者更确切地说,对其进行适当的覆盖。除非m1(B)不是. _ _ _ (在我的脑海中,我不知道覆盖是否可以扩大参数签名,但它们当然不能缩小它们。)m1(A)

于 2013-02-14T18:01:56.920 回答