簡體   English   中英

Java方法調用重載邏輯

[英]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 - 但是這兩種方法不能同時被調用。

BA的子類。 由於您實例化B ,但將其分配給變量類型A ,所有B細節都將“丟失”,因此call(a)將被調度到call(A, a)並打印'A'。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM