二者的定義:
1、重載發(fā)生在同一個類中翘悉,若多個方法之間方法名相同茫打、參數(shù)列表不同,則它們構(gòu)成重載的關(guān)系镐确。重載與方法的返回值以及訪問修飾符無關(guān)包吝,即重載的方法不能根據(jù)返回類型進(jìn)行區(qū)分。
2源葫、重寫發(fā)生在父類子類中诗越,若子類方法想要和父類方法構(gòu)成重寫關(guān)系,則它的方法名息堂、參數(shù)列表必須與父類方法相同嚷狞。另外,返回值要小于等于父類方法荣堰,拋出的異常要小于等于父類方法床未,訪問修飾符則要大于等于父類方法。還有振坚,若父類方法的訪問修飾符為private薇搁,則子類不能對其重寫。
編譯和運(yùn)行的角度來看
1渡八、方法重載啃洋,是通過靜態(tài)解析實現(xiàn)的传货,靜態(tài)解析是指有些符號引用是在類加載階段或是第一次使用時就會轉(zhuǎn)換成直接引用。編譯器就可以完全確定宏娄,既然是靜態(tài)的行為问裕,那么調(diào)用方法傳的參數(shù)則會只認(rèn)變量的靜態(tài)類型,而非變量的實際類型(其他靜態(tài)解析有靜態(tài)方法孵坚,父類方法粮宛,構(gòu)造方法,私有方法)
2卖宠、方法重寫巍杈,是通過動態(tài)分派實現(xiàn)的,動態(tài)分派是指一些符號引用則是在每次運(yùn)行期轉(zhuǎn)換為直接引用逗堵。在字節(jié)碼層面是通過invokevirtual字節(jié)碼指令實現(xiàn)的秉氧,invokevirtual多態(tài)查找的過程是①:首先在操作數(shù)棧的棧頂去尋找到棧頂?shù)脑厮赶驅(qū)ο蟮膶嶋H類型。②:在該實際類型的對象當(dāng)中,如果尋找到了與常量池中描述符和名稱都相同的方法,并且具備相應(yīng)的訪問權(quán)限,就會直接返回目標(biāo)方法的直接引用(就是Apple.test())③:如果在實際類型的對象中沒有找到該方法,那么就去其父類,繼續(xù)執(zhí)行該查找流程,直到找到,或者拋出異常