[英]Java method call overloading logic
對於以下代碼,為什么要打印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);
}
}
重載由編譯器靜態確定。 覆蓋是在執行時完成的,但這不是一個因素。
靜態類型的a
為A,因此第一個方法調用被解析為call(A a)
由於此時對象的類型A
已知,因此調用帶參數A
的方法。 所以是的,它是靜態決定的。
這是為了避免含糊不清。 你的B
也是A
- 但是這兩種方法不能同時被調用。
B
是A
的子類。 由於您實例化B
,但將其分配給變量類型A
,所有B
細節都將“丟失”,因此call(a)
將被調度到call(A, a)
並打印'A'。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.