天天看點

Java中重載與重寫對比

1.重載(overloading)

重載的意義是兩個方法名稱相同,但是參數不同,是以重載與重寫毫無關系。重載可以有同一方法的多個不同參數版本以友善調用,可以了解為在同一個類中多态的展現。

1)傳回類型可以不同

你可以任意改變重載方法的傳回類型,隻要所有的方法使用不同的參數即可;

2)不能隻改變傳回類型(傳回類型不同不能作為重載的區分标準)

如果隻有傳回類型不同,但參數一樣,這是不允許的。編譯器不會讓這樣的事情過關。重載的條件必須是使用不同的參數(類型或者個數不同)。

3)可以更改存取權限

可以任意設定overload版method的存取權限(存取權限由小至大:private、default、protected、public)。

2.重寫(overriding)

重寫也稱覆寫,即在子類中定義與父類相同名稱和參數的方法,可以了解為通過繼承父類在子類中展現多态。

1)參數必須一樣,且傳回類型必須相容

不管父類使用了哪種參數,覆寫此方法的子類也一定要使用相同的參數。而不論父類聲明的傳回類型是什麼,子類必須要聲明傳回類型一樣的類型或該類型的父類型的子類型。

2)不能降低方法的存取權限

重寫的子類的存取權限必須不低于父類的存取權限,也就是說,你不能覆寫掉一個public的方法并将其标記為私有。因為編譯過程會認為公有,結果執行時候由于私有導緻JVM阻止存取。

方法的重寫(override)須遵循兩同兩小一大原則:

方法名相同,參數類型相同

子類傳回類型小于等于父類方法傳回類型,

子類抛出異常小于等于父類方法抛出異常,

子類通路權限大于等于父類方法通路權限。

附錄:

1)編譯器檢查對象聲明的類型和方法名,進而擷取所有候選方法。

2)重載決策:編譯器檢查方法調用的參數類型,從上述候選方法選出唯一的那一個(可能會出現隐含類型轉化),如果編譯器找到多餘一個或者沒找到,編譯會不通過。

3)若方法類型為private static final,java 采用靜态編譯,編譯器會準确知道該調用哪個方法。

4)當程式運作,并且使用動态綁定調用一個方法時,那麼虛拟機必須調用對象的實際類型相比對的方法版本。

注:

參考網絡和java head first,屬于個人總結。