java:方法覆蓋與方法過載
方法簽名
方法簽名是指方法的引數型別,順序和個數.不包含方法名稱.
過載
過載必須滿足以下條件
- 方法名 相同
- 方法的引數型別,個數和順序至少一項不同
- 方法的返回型別可以不同
- 方法的訪問許可權修飾符可以不同
覆蓋
如果在子類中定義的一個方法,其名稱,返回型別及引數簽名正好與父類中某個方法的名稱、返回型別及引數簽名相匹配,那麼子類覆蓋了父類的方法。
覆蓋必須滿足以下條件:
- 子類方法的名稱、引數簽名和返回型別必須與父類方法保持一致。
-
子類方法不能縮小父類方法的訪問許可權。
如果沒有這個限制,會與java語言的多型機制發生衝突。
//建立父型別的變數,引用子類的例項 Parent parent = new Child(); //呼叫的是子類例項的方法,如果子類覆蓋這個方法時,縮小了訪問許可權,可能會造成無法訪問到子類例項的這個方法 parent.method();
- 子類方法不能丟擲比父類方法更多的異常.子類方法丟擲的異常必須與父類方法丟擲的異常相同,或者父類方法丟擲的異常類是父類方法丟擲異常類的子類.
- 方法覆蓋只存在於子類和父類(包括直接父類和間接父類)之間.在同一個類中方法只能被過載,不能被覆蓋.
- 父類的靜態方法不能被子類覆蓋為非靜態方法.
- 父類的非靜態方法不能被子類覆蓋為靜態方法
- 父類的私有方法不能被子類覆蓋
- 父類的非抽象方法可以被子類覆蓋為抽象方法
異同
-
相同點
- 方法名要保持一致
-
不同點
- 方法覆蓋要求引數簽名一致,而方法過載要求引數簽名必須不一致.
- 覆蓋要求返回型別一致,或者子類方法返回型別小於父類方法,過載對此不做限制.
- 覆蓋只能用於子類覆蓋父類的方法,過載用於同一個類的所有方法(包括從父類中繼承而來的方法).
- 覆蓋對方法的訪問許可權和丟擲異常有要求,過載不做限制.
- 父類的一個方法只能被子類覆蓋一次,而一個方法在所在的類中可以被過載多次.