有的時候,類的同一種功能有多種實作方式,到底采用哪種實作方式,取決于調用者給定的參數。例如我們最常用的System.out.println()能夠列印出任何資料類型的資料,它有多種實作方式。運作時,Java虛拟機先判斷給定參數的類型,然後決定執行哪個println()方法(int char String等)。
重載(overload):對于類的方法(包括從父類中繼承的方法),方法名相同,參數清單不同的方法之間就構成了重載關系。這裡有兩個問題需要注意:
(1) 什麼叫參數清單?參數清單又叫參數簽名,指三樣東西:參數的類型,參數的個數,參數的順序。這三者隻要有一個不同就叫做參數清單不同。
(2) 重載關系隻能發生在同一個類中嗎?非也。這時候你要深刻了解繼承,要知道一個子類所擁有的成員除了自己顯式寫出來的以外,還有父類遺傳下來的。是以子類中的某個方法和父類中繼承下來的方法也可以發生重載的關系。
大家在使用的時候要緊扣定義,看方法之間是否是重載關系,不用管方法的修飾符和傳回類型以及抛出的異常,隻看方法名和參數清單。而且要記住,構造器也可以重載。
覆寫 (override):也叫重寫,就是在當父類中的某些方法不能滿足要求時,子類中改寫父類的方法。當父類中的方法被覆寫了後,除非用super關鍵字,否則就無法再調用父類中的方法了。
發生覆寫的條件:
1、“三同一不低” 子類和父類的方法名稱,參數清單,傳回類型必須完全相同,而且子類方法的通路修飾符的權限不能比父類低。
2、子類方法不能抛出比父類方法更多的異常。即子類方法所抛出的異常必須和父類方法所抛出的異常一緻,或者是其子類,或者什麼也不抛出;
3、被覆寫的方法不能是final類型的。因為final修飾的方法是無法覆寫的。
4、被覆寫的方法不能為private。否則在其子類中隻是新定義了一個方法,并沒有對其進行覆寫。
5、被覆寫的方法不能為static。是以如果父類中的方法為靜态的,而子類中的方法不是靜态的,但是兩個方法除了這一點外其他都滿足覆寫條件,那麼會發生編譯錯誤。反之亦然。即使父類和子類中的方法都是靜态的,并且滿足覆寫條件,但是仍然不會發生覆寫,因為靜态方法是在編譯的時候把靜态方法和類的引用類型進行比對。
方法的覆寫和重載具有以下相同點:
都要求方法同名
都可以用于抽象方法和非抽象方法之間
方法的覆寫和重載具有以下不同點:
方法覆寫要求參數清單(參數簽名)必須一緻,而方法重載要求參數清單必須不一緻。
方法覆寫要求傳回類型必須一緻,方法重載對此沒有要求。
方法覆寫隻能用于子類覆寫父類的方法,方法重載用于同一個類中的所有方法(包括從父類中繼承而來的方法)
方法覆寫對方法的通路權限和抛出的異常有特殊的要求,而方法重載在這方面沒有任何限制。