java筆記之過載與覆蓋
有的時候,類的同一種功能有多種實現方式,到底採用哪種實現方式,取決於呼叫者給定的引數。例如我們最常用的System.out.println()能夠打印出任何資料型別的資料,它有多種實現方式。執行時,Java虛擬機器先判斷給定引數的型別,然後決定執行哪個println()方法(int char String等)。
過載(overload):對於類的方法(包括從父類中繼承的方法),方法名相同,引數列表不同的方法之間就構成了過載關係。這裡有兩個問題需要注意:
(1) 什麼叫引數列表?引數列表又叫引數簽名,指三樣東西:引數的型別
(2) 過載關係只能發生在同一個類中嗎?非也。這時候你要深刻理解繼承,要知道一個子類所擁有的成員除了自己顯式寫出來的以外,還有父類遺傳下來的。所以子類中的某個方法和父類中繼承下來的方法也可以發生過載的關係。
大家在使用的時候要緊扣定義,看方法之間是否是過載關係,不用管方法的修飾符和返回型別以及丟擲的異常,只看方法名和引數列表。而且要記住,構造器也可以過載。
覆蓋 (override):也叫重寫,就是在當父類中的某些方法不能滿足要求時,子類中改寫父類的方法。當父類中的方法被覆蓋了後,除非用super關鍵字,否則就無法再呼叫父類中的方法了。
發生覆蓋的條件:
1、“三同一不低” 子類和父類的方法名稱,引數列表,返回型別必須完全相同,而且子類方法的訪問修飾符的許可權不能比父類低。
2、子類方法不能丟擲比父類方法更多的異常。即子類方法所丟擲的異常必須和父類方法所丟擲的異常一致,或者是其子類,或者什麼也不丟擲;
3、被覆蓋的方法不能是final型別的。因為final修飾的方法是無法覆蓋的。
4、被覆蓋的方法不能為private。否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
5、被覆蓋的方法不能為static。所以如果父類中的方法為靜態的,而子類中的方法不是靜態的,但是兩個方法除了這一點外其他都滿足覆蓋條件,那麼會發生編譯錯誤。反之亦然。即使父類和子類中的方法都是靜態的,並且滿足覆蓋條件,但是仍然不會發生覆蓋,因為靜態方法是在編譯的時候把靜態方法和類的引用型別進行匹配。
方法的覆蓋和過載具有以下相同點:
都要求方法同名
都可以用於抽象方法和非抽象方法之間
方法的覆蓋和過載具有以下不同點:
方法覆蓋要求引數列表(引數簽名)必須一致,而方法過載要求引數列表必須不一致。
方法覆蓋要求返回型別必須一致,方法過載對此沒有要求。
方法覆蓋只能用於子類覆蓋父類的方法,方法過載用於同一個類中的所有方法(包括從父類中繼承而來的方法)
方法覆蓋對方法的訪問許可權和丟擲的異常有特殊的要求,而方法過載在這方面沒有任何限制。
父類的一個方法只能被子類覆蓋一次,而一個方法可以在所有的類中可以被過載多次。
另外,對於屬性(成員變數)而言,是不能過載的,只能覆蓋。
轉自:
http://blog.csdn.NET/lenotang/article/details/2681525
有的時候,類的同一種功能有多種實現方式,到底採用哪種實現方式,取決於呼叫者給定的引數。例如我們最常用的System.out.println()能夠打印出任何資料型別的資料,它有多種實現方式。執行時,Java虛擬機器先判斷給定引數的型別,然後決定執行哪個println()方法(int char String等)。
過載(overload):對於類的方法(包括從父類中繼承的方法),方法名相同,引數列表不同的方法之間就構成了過載關係。這裡有兩個問題需要注意:
(1) 什麼叫引數列表?引數列表又叫引數簽名,指三樣東西:引數的型別,引數的個數,引數的順序。這三者只要有一個不同就叫做引數列表不同。
(2) 過載關係只能發生在同一個類中嗎?非也。這時候你要深刻理解繼承,要知道一個子類所擁有的成員除了自己顯式寫出來的以外,還有父類遺傳下來的。所以子類中的某個方法和父類中繼承下來的方法也可以發生過載的關係。
大家在使用的時候要緊扣定義,看方法之間是否是過載關係,不用管方法的修飾符和返回型別以及丟擲的異常,只看方法名和引數列表。而且要記住,構造器也可以過載。
覆蓋 (override):也叫重寫,就是在當父類中的某些方法不能滿足要求時,子類中改寫父類的方法。當父類中的方法被覆蓋了後,除非用super關鍵字,否則就無法再呼叫父類中的方法了。
發生覆蓋的條件:
1、“三同一不低” 子類和父類的方法名稱,引數列表,返回型別必須完全相同,而且子類方法的訪問修飾符的許可權不能比父類低。
2、子類方法不能丟擲比父類方法更多的異常。即子類方法所丟擲的異常必須和父類方法所丟擲的異常一致,或者是其子類,或者什麼也不丟擲;
3、被覆蓋的方法不能是final型別的。因為final修飾的方法是無法覆蓋的。
4、被覆蓋的方法不能為private。否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
5、被覆蓋的方法不能為static。所以如果父類中的方法為靜態的,而子類中的方法不是靜態的,但是兩個方法除了這一點外其他都滿足覆蓋條件,那麼會發生編譯錯誤。反之亦然。即使父類和子類中的方法都是靜態的,並且滿足覆蓋條件,但是仍然不會發生覆蓋,因為靜態方法是在編譯的時候把靜態方法和類的引用型別進行匹配。
方法的覆蓋和過載具有以下相同點:
都要求方法同名
都可以用於抽象方法和非抽象方法之間
方法的覆蓋和過載具有以下不同點:
方法覆蓋要求引數列表(引數簽名)必須一致,而方法過載要求引數列表必須不一致。
方法覆蓋要求返回型別必須一致,方法過載對此沒有要求。
方法覆蓋只能用於子類覆蓋父類的方法,方法過載用於同一個類中的所有方法(包括從父類中繼承而來的方法)
方法覆蓋對方法的訪問許可權和丟擲的異常有特殊的要求,而方法過載在這方面沒有任何限制。
父類的一個方法只能被子類覆蓋一次,而一個方法可以在所有的類中可以被過載多次。
另外,對於屬性(成員變數)而言,是不能過載的,只能覆蓋。
轉自:
http://blog.csdn.NET/lenotang/article/details/2681525