Java多態(tài)分為編譯期多態(tài)和運(yùn)行時(shí)多態(tài),編譯期多態(tài)是指重載,運(yùn)行時(shí)多態(tài)有三個(gè)條件:1、繼承? 2、重寫? 3、向上轉(zhuǎn)型,三個(gè)條件缺一不可。
重載:方法名相同,方法參數(shù)不同的方法。這樣做是因?yàn)橥粋€(gè)方法中無法完成多個(gè)只是類型不一樣但是操作一樣的動(dòng)作,那么我們可以通過重載來做。
Java中的方法的重載在編譯期就已經(jīng)產(chǎn)生了方法的描述符,在執(zhí)行的時(shí)候根據(jù)方法的描述符和傳入的參數(shù)選擇方法執(zhí)行,這樣的形式稱為編譯期的多態(tài)。
為什么Java的重載是以方法名和參數(shù)來作為方法的描述符的?
答:在方法執(zhí)行中,有時(shí)候只關(guān)心方法的執(zhí)行過程而不關(guān)心方法的返回值。所以我們用方法名和方法的參數(shù)做方法的描述符。描述符是在編譯期就已經(jīng)產(chǎn)生。
重寫:子類繼承父類的方法,并對(duì)父類方法的方法體進(jìn)行重新編寫。
重寫要遵循兩同兩小一大規(guī)則
兩同:方法名相同且形參列表相同
兩小:子類的返回值類型小于等于父類方法的返回值類型,子類方法拋出的異常小于等于父類方法拋出異常的類型
一大:子類方法的訪問權(quán)限修飾符大于等于父類方法的訪問權(quán)限修飾符
注意:1、子類能重寫的一定是子類從父類繼承的方法,如果父類的方法是private修飾,則子類繼承不了,也就不存在重寫了。
2、子類重寫的方法和父類重寫的方法要么都是類方法(static修飾),要么都是實(shí)例方法,不能一個(gè)是類方法,一個(gè)是實(shí)例方法,會(huì)編譯錯(cuò)誤。
3、當(dāng)子類的重寫了父類的方法后 ,子類的實(shí)例化對(duì)象將不能調(diào)用父類的方法,但是可以在子類方法中通過super調(diào)用父類的方法。