有的時候,類的同一種功能有多種實現方式,到底採用哪一種實現方式,取決於調用者給定的參數。例如咱們最經常使用的System.out.println()可以打印出任何數據類型的數據,它有多種實現方式。運行時,Java虛擬機先判斷給定參數的類型,而後決定執行哪一個println()方法(int char String等)。ide
重載(overload):對於類的方法(包括從父類中繼承的方法),方法名相同,參數列表不一樣的方法之間就構成了重載關係。這裏有兩個問題須要注意:繼承
(1) 什麼叫參數列表?參數列表又叫參數簽名,指三樣東西:參數的類型,參數的個數,參數的順序。這三者只要有一個不一樣就叫作參數列表不一樣。虛擬機
(2) 重載關係只能發生在同一個類中嗎?非也。這時候你要深入理解繼承,要知道一個子類所擁有的成員除了本身顯式寫出來的之外,還有父類遺傳下來的。因此子類中的某個方法和父類中繼承下來的方法也能夠發生重載的關係。編譯
你們在使用的時候要緊扣定義,看方法之間是不是重載關係,不用管方法的修飾符和返回類型以及拋出的異常,只看方法名和參數列表。並且要記住,構造器也能夠重載。變量
覆蓋 (override):也叫重寫,就是在當父類中的某些方法不能知足要求時,子類中改寫父類的方法。當父類中的方法被覆蓋了後,除非用super關鍵字,不然就沒法再調用父類中的方法了。權限
發生覆蓋的條件:數據類型
一、「三同一不低」 子類和父類的方法名稱,參數列表,返回類型必須徹底相同,並且子類方法的訪問修飾符的權限不能比父類低。引用
二、子類方法不能拋出比父類方法更多的異常。即子類方法所拋出的異常必須和父類方法所拋出的異常一致,或者是其子類,或者什麼也不拋出;方法
三、被覆蓋的方法不能是final類型的。由於final修飾的方法是沒法覆蓋的。數據
四、被覆蓋的方法不能爲private。不然在其子類中只是新定義了一個方法,並無對其進行覆蓋。
五、被覆蓋的方法不能爲static。因此若是父類中的方法爲靜態的,而子類中的方法不是靜態的,可是兩個方法除了這一點外其餘都知足覆蓋條件,那麼會發生編譯錯誤。反之亦然。即便父類和子類中的方法都是靜態的,而且知足覆蓋條件,可是仍然不會發生覆蓋,由於靜態方法是在編譯的時候把靜態方法和類的引用類型進行匹配。
方法的覆蓋和重載具備如下相同點:
都要求方法同名
均可以用於抽象方法和非抽象方法之間
方法的覆蓋和重載具備如下不一樣點:
方法覆蓋要求參數列表(參數簽名)必須一致,而方法重載要求參數列表必須不一致。
方法覆蓋要求返回類型必須一致,方法重載對此沒有要求。
方法覆蓋只能用於子類覆蓋父類的方法,方法重載用於同一個類中的全部方法(包括從父類中繼承而來的方法)
方法覆蓋對方法的訪問權限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。
父類的一個方法只能被子類覆蓋一次,而一個方法能夠在全部的類中能夠被重載屢次。
另外,對於屬性(成員變量)而言,是不能重載的,只能覆蓋。