過載(overload)和覆蓋(override)有什麼區別(終結篇)
過載(overload)和覆蓋(override)是Java多型性的不同表現方式。其中,過載是在一個類中多型性的一種表現,是指在一個類中定義了多個同名的方法,它們或有不同的引數個數或有不同的引數型別,是同類或者父類與子類中的橫向關係;覆蓋是指派生類函式覆蓋基類函式。覆蓋一個方法並對其重寫,以達到不同的作用,是父類與子類之間的垂直關係。
在使用過載(overload)時,需要注意以下幾點:
1)過載是通過不同的方法引數來區分的,例如不同的引數個數、不同的引數型別或不同的引數順序。
2)不能通過方法的訪問許可權、返回值型別和丟擲的異常型別來進行過載。
3)對於繼承來說,如果基類方法的訪問許可權為
在使用覆蓋(override)時,需要注意以下幾點:
(1)派生類中的覆蓋方法必須要和基類中被覆蓋的方法有相同的函式名和引數。
(2)派生類中的覆蓋方法的返回值必須和基類中被覆蓋的方法的返回值相同。
(3)派生類中的覆蓋方法所丟擲的異常必須和基類(或是其子類)中被覆蓋的方法所丟擲的異常一致。
(4)基類中被覆蓋的方法不能為private,否則其子類知識定義了一個方法,並沒有對其覆蓋。
Override 特點
1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;
4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。
Overload 特點
1、在使用過載時只能通過不同的引數樣式。例如,不同的引數型別,不同的引數個數,不同的引數順序(當然,同一方法內的幾個引數型別必須不一樣,例如可以是fun(int, float), 但是不能為fun(int, int));
2、不能通過訪問許可權、返回型別、丟擲的異常進行過載;
3、方法的異常型別和數目不會對過載造成影響;
4、對於繼承來說,如果某一方法在父類中是訪問許可權是
過載和覆蓋的區別主要有以下幾個方面:
1)覆蓋是子類和父類之間的關係,是垂直關係;過載是同一個類中方法之間的關係,是水平關係。
2)覆蓋只能由一個方法或只能由一對方法產生關係;過載是由多個方法之間的關係。
3)覆蓋要求引數列表相同;過載要求引數列表不同。
4)覆蓋關係中,呼叫方法體是根據物件的型別(物件對應儲存空間型別)來決定;而過載關係是根據呼叫時的實參表與形參表來選擇方法體的。