java 方法的覆寫(overriding)與重載(override)
轉自:方法的覆寫與重載
方法的覆寫
在類繼承中,子類可以修改從父類繼承來的方法,也就是說子類能建立一個與父類方法有不同功能的方法,但具有相同的名稱、傳回值類型、參數清單。
如果在新類中定義一個方法,其名稱、傳回值類型和參數清單正好與父類中的相同,那麼,新方法被稱做覆寫舊方法。
參數清單又叫參數簽名,包括參數的類型、參數的個數和參數的順序,隻要有一個不同就叫做參數清單不同。
被覆寫的方法在子類中隻能通過super調用。
注意:覆寫不會删除父類中的方法,而是對子類的執行個體隐藏,暫時不使用。
請看下面的例子:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
運作結果:
複制代碼代碼如下:
我是一隻小狗,我的名字叫行行圈,我會發出汪汪的叫聲
我是一隻小動物,我的名字叫行行圈線上,我會發出叫聲
方法覆寫的原則:
覆寫方法的傳回類型、方法名稱、參數清單必須與原方法的相同。
覆寫方法不能比原方法通路性差(即通路權限不允許縮小)。
覆寫方法不能比原方法抛出更多的異常。
被覆寫的方法不能是final類型,因為final修飾的方法是無法覆寫的。
被覆寫的方法不能為private,否則在其子類中隻是新定義了一個方法,并沒有對其進行覆寫。
被覆寫的方法不能為static。如果父類中的方法為靜态的,而子類中的方法不是靜态的,但是兩個方法除了這一點外其他都滿足覆寫條件,那麼會發生編譯錯誤;反之亦然。即使父類和子類中的方法都是靜态的,并且滿足覆寫條件,但是仍然不會發生覆寫,因為靜态方法是在編譯的時候把靜态方法和類的引用類型進行比對。
方法的重載:
前面已經對Java方法重載進行了說明,這裡再強調一下,Java父類和子類中的方法都會參與重載,例如,父類中有一個方法是 func(){ ... },子類中有一個方法是 func(int i){ ... },就構成了方法的重載。
覆寫和重載的不同:
方法覆寫要求參數清單必須一緻,而方法重載要求參數清單必須不一緻。
方法覆寫要求傳回類型必須一緻,方法重載對此沒有要求。
方法覆寫隻能用于子類覆寫父類的方法,方法重載用于同一個類中的所有方法(包括從父類中繼承而來的方法)。
方法覆寫對方法的通路權限和抛出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
父類的一個方法隻能被子類覆寫一次,而一個方法可以在所有的類中可以被重載多次。