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