標籤:
內容來源為:《孫衛琴物件導向編程》,本隨筆簡單總結,具體內容可參見概述第6章,寫的挺清晰;
一. 重載(Overload)
1. 有時候類的同一種功能有多種實現方式,到底採用哪種實現方式,取決於調用者給定的參數(如建構函式就是一種例子);
2. 對於類的方法(包括從父類中繼承的方法),如果有兩個方法的方法名相同,但參數不一樣,那麼可以說,一個方法是另一個方法的重載方法。
3. 重載方法必須滿足以下條件:
(1)方法名相同;
(2)方法的參數類型、個數、順序至少有一項不同;
(3)方法的傳回值類型可以不同;
(4)方法的修飾符可以不同;
4. 在一個類中不允許定義兩個方法名相同,並且參數簽名也完全相同的方法。因為假如存在這樣的方法,Java虛擬機器在運行時就無法決定到底執行哪個方法,參數簽名是指參數的 類型、個數和順序。
二. 重寫(OverWrite)
1. 如果在子類中定義的一個方法,其名稱、傳回值類型及參數簽名正好與父類中的某個方法的名稱,傳回值類型及參數名相匹配,那麼可以說,子類的方法重寫了(覆蓋)父類的方法;
2. 重寫方法必須滿足以下約束條件:
(1)子類的方法的名稱、參數簽名和傳回值類型必須與父類方法的名稱、參數簽名及傳回值類型一致;
(2)子類在重寫父類方法時,重寫方法不能縮小父類方法的存取權限(原因是和多態機制衝突,詳細內容可看《Java物件導向編程》);
(3)子類方法不能拋出比父類方法更多的異常;子類方法拋出的異常必須和父類方法拋出的異常相同,或者子類方法拋出的異常是父類方法拋出的異常的子類(原因是和多態機制衝突,詳細內容可看《Java物件導向編程》);
(4)方法重寫之存在於子類和父類之間(包括直接父類和間接父類),在同一個類中,方法只能重載不能重寫。
(5)父類的靜態方法不能被子類重寫為非靜態方法;
(6)子類可以定義與父類的靜態方法同名的靜態方法,以便在子類中隱藏父類中的靜態方法;
(7)父類的非靜態方法不能被子類重寫為靜態方法;
(8)父類中的私人方法不能被子類重寫;原因:子類方法重寫父類方法的前提是,子類必須能繼承父類的特定方法,因此父類中的私人方法不能被子類繼承,也就無法構成重寫,即使在形式上符合重寫的規範,也不能算得上重寫;
(9)父類的抽象方法可以被子類通過兩種方式重寫,一是實現父類的抽象方法,二是重新聲明父類的抽象方法。
(10)父類的非抽象方法可以被重寫為抽象方法。
Java之重載(Overload)與重寫(Overwrite)總結