簡體   English   中英

方法重載還是覆蓋?

[英]Method overloading or overriding?

我們有一個父子 class,它有同名的方法,但參數是原語和包裝器。 有人可以解釋一下這是否被稱為方法覆蓋和方法重載的原因。 運行這個程序會調用 Parent 方法——它會覆蓋而不是重載,尋找解釋。

class Parent {
    public void takeValue(int a) {
        System.out.println("take value method from parent is invoked");
    }
}

class Child extends Parent {
    public void takeValue(Integer a) {
        System.out.println("take value method from child is invoked");

    }

    public static void main(String[] args) {
        Parent p = new Child();
        p.takeValue(new Integer(51));
    }
}

該方法已重載。

運行這個程序會調用 Parent 方法——它會覆蓋而不是重載

是的。 您正在對Parent變量調用takeValue ,這意味着編譯器將在Parent class 上查找簽名匹配。 這里甚至看不到重載(簽名是根據 static 類型匹配的,即 java 根據調用方法的變量的聲明數據類型查找方法,而不是使用 ZA8ZCFDE6331DC4BEB6666661AC 變量的數據類型,這將是一個運行時的事情)。

並且因為public void takeValue(Integer a)在檢查方法調用時沒有被編譯器考慮,所以p.takeValue(new Integer(51)); 通過自動裝箱鏈接到Parent.takeValue(int) (如果它們都是可見的,它將匹配其他方法 - 或者在此示例中在Parent class 中聲明)。

這是超載。 您具有相同的名稱,但輸入參數的類型不同。

要確認這一點,當您嘗試附加@Override注釋時會收到錯誤消息。

Integerint是不同的類型。

JavaOverridingOverloading是非常重要的概念。要充分理解差異,我強烈建議您閱讀以下內容:

暫無
暫無

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

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