內容來源為:《孫衛琴面向對象編程》,本隨筆簡單總結,具體內容可參見概述第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)父類的非抽象方法可以被重寫為抽象方法。