我对 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
}
}
最佳答案
重载 解析是根据编译时类型完成的。 A
类型的变量仅公开方法 m1()
和 m1(A)
。因为你传入了一个参数,所以调用了m1(A)
;或者更确切地说,对其进行适当的覆盖。除了 m1(B)
不是 m1(A)
的覆盖。 (在我的脑海中,我不知道覆盖是否可以扩大参数签名,但它们肯定不能缩小它们。)
关于Java Dispatching-Runtime类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14881072/