二、Java面向對象(8)_繼承思想——方法覆蓋
2018-05-01
方法覆蓋(重寫)
override(覆蓋):
覆蓋解決的問題:當父類的某一個行為(方法)不符合子類具體的特征時,此時父類需要重新定義父類方法,並重寫方法體。
註意:只有方法才有覆蓋的概念,字段沒有。
方法覆蓋的原則:
1、實例方法簽名必須相同。(方法簽名 = 方法名稱 + 方法參數列表)
2、子類方法不能返回比父類方法更大的數據類型,子類方法的返回值類型必須和父類方法的返回值類型相同,或者子類方法的返回值類型是父類方法的返回值類型的子類。
(子類可以返回更具體的數據類型,比如父類返回Object,子類可以返回String)
3、子類方法不能低於父類方法的訪問權限
4、子類方法不能拋出比父類方法更多的異常,子類方法拋出的異常必須和父類方法拋出的異常相同,或者子類方法拋出的異常類是父類方法拋出的異常類的子類 。
5、方法覆蓋只存在於子類和父類(包括直接父類和間接父類)之間。在同一個類中方法只能被重載,不能被覆蓋。
建議:直接復制父類方法到子類中,再重寫其方法體即可。
方法覆蓋的判斷:在方法前寫上@override標簽。
若覆蓋成功,則編譯通過,否則編譯失敗。
代碼舉例:
1 //鳥類
2 class Bird
3 {
4 public void fly(){
5 System.out.println("自由飛翔");
6 }
7 }
8 //企鵝
9
10 class Penguin extends Bird
11 {
12 @override
13 public void fly(){
14 System.out.println("折翼天使");
15 }
16 }
17
18
19
20 //方法覆蓋
21 class OverrideDemo
22 {
23 public static void main(String[] args)
24 {
25 //創建一個企鵝對象
26 Penguin p = new Penguin();
27 //調用飛翔方法
28 p.fly();
29 }
30 }
輸出結果:
參考博客:
http://ihyperwin.iteye.com/blog/1553609
-----------------------------------------------------------------------------------------------------------------------
方法覆蓋和方法重載的區別:
override:覆蓋(重寫)
overload:重載
實際上兩者沒有任何關系。
方法重載定義:在一個類中定義多個同名的方法,要求方法之間的參數列表不同即可。
方法重載的作用:完成一組任務相似但參數的類型或參數的個數不同的方法。(屏蔽同一功能的方法由於參數不同而造成方法名稱不同的差異)
方法重載的調用:Java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。
方法重載的判斷:兩同一不同
兩同:同一個類,方法名稱相同
一不同:方法的參數列表不一致(參數類型、參數個數、參數順序)
註意:方法重載和方法返回值類型無關,只是一般要求同一功能的方法返回值類型一致
參數列表和參數名稱無關,也就是說方法重載和形參無關
Java編譯器能通過檢查調用的方法的參數類型和個數選擇一個恰當的方法。
二、Java面向對象(8)_繼承思想——方法覆蓋