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,屬于個人總結。