更新時(shí)間:2023年02月17日14時(shí)59分 來源:傳智教育 瀏覽次數(shù):
重載(overload)和覆蓋(override)是Java多態(tài)性的兩種同表現(xiàn)方式。細(xì)節(jié)在于,重載是說在一個(gè)類里面定義了多個(gè)同名的方法,這些方法的參數(shù)類型與個(gè)數(shù)的不盡相同。重載可以理解成是多態(tài)性的一種表現(xiàn)。我們在使用重載的時(shí)候,還應(yīng)該注意以下幾個(gè)點(diǎn):
1)重載是通過不同的方法參數(shù)來區(qū)分的,比方說不同的參數(shù)類型、不同的參數(shù)個(gè)數(shù)以及不同的參數(shù)順序。
2)不可以通過方法的返回值類型、拋出的異常類型以及訪問權(quán)限來進(jìn)行重載。
3)拿繼承舉例,如果基類的方法的訪問權(quán)限為private,那么就不能在派生類對其重載;如果派生類也定義了一個(gè)同名的函數(shù),這相當(dāng)于一個(gè)新的方法,并不能達(dá)到重載的效果。
覆蓋指的是派生類函數(shù)覆蓋基類函數(shù)。覆蓋一個(gè)方法并對其重寫,來達(dá)到不同的作用。在使用覆蓋時(shí)一般需要注意以下幾點(diǎn):
1)派生類中的覆蓋方法的返回值必須和基類中被覆蓋白方法的返回值相同。
2)派生類中的覆蓋方法必須要和基類中被覆蓋的方法有相同的函數(shù)名和參數(shù)。
3)派生類中的覆蓋方法所拋出的異常必須和基類(或是其子類)中被覆蓋的方法所拋出的異常一致。
4)基類中被覆蓋的方法不能為private,否則其子類只是定義了一個(gè)方法,并沒有對齊覆蓋。
重載與覆蓋主要的區(qū)別是什么?
1)重載屬于水平關(guān)系,也即同一個(gè)類中方法之間的關(guān)系;覆蓋屬于垂直關(guān)系,是父類和子類之間的關(guān)系。
2)重載是多個(gè)方法之間的關(guān)系;覆蓋只能由一對方法或者只由一個(gè)方法產(chǎn)生關(guān)系。
3)重載要求參數(shù)列表可以是不同的;覆蓋要求參數(shù)列表必須相同。
4)重載關(guān)系是根據(jù)調(diào)用時(shí)的實(shí)參表與形參表來選擇方法體的;而覆蓋關(guān)系中,調(diào)用方法體時(shí)根據(jù)對象的類型(對象對應(yīng)存儲(chǔ)空間類型)來決定的。
常見筆試題:
如下代碼的運(yùn)行結(jié)果是什么?
class Super { public int f() { return 1; } } public class SubClass extends Super { public float f() { return 2f; } public static void main(String[] args) { Super s = new SubClass; System.out.println(s.f()); } }
答案:編譯錯(cuò)誤。因?yàn)楹瘮?shù)是不能以返回值來區(qū)分的,雖然父類與子類中的函數(shù)有著不同返回值,但是它們有著相同的函數(shù)名,因此,編譯器無法區(qū)分。
北京校區(qū)