更新時(shí)間:2020-07-29 15:19:32 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2505次
問:下面程序段能正常編譯嗎?輸出是什么?為什么?
答:上面程序段 func(null) 無法編譯,其他三個(gè)調(diào)用輸出結(jié)果如下。
func val.
func args.
func args.
因?yàn)樵谡{(diào)用方法的時(shí)如果能和固定參數(shù)方法匹配且同時(shí)也能與可變長(zhǎng)參數(shù)方法匹配,則會(huì)選擇調(diào)用固定參數(shù)的方法,所以才有了上面的打印。而對(duì)于 func(null) 來說,編譯器不知道要調(diào)用哪個(gè)方法,所以要避免 null 值的影響。
問:下面的程序段有什么問題嗎?
答:上面程序段 sub.print("") 無法編譯通過,其他沒有問題,具體按行執(zhí)行結(jié)果如下。
首先base對(duì)象把子類對(duì)象sub做了向上轉(zhuǎn)型,而形參列表在靜態(tài)編譯時(shí)是由父類決定的,所以父類形參列表是標(biāo)準(zhǔn)的變長(zhǎng)參數(shù)形式,故而調(diào)用時(shí)能接收字符串或者字符串?dāng)?shù)組類型,而在動(dòng)態(tài)運(yùn)行時(shí)由于多態(tài)特性會(huì)調(diào)用子類sub的重寫方法,所以打印兩個(gè)Sub print。
而對(duì)于sub子類直接調(diào)用的情況,編譯器看到子類覆寫了父類的print方法,所以形參列表在靜態(tài)編譯時(shí)是子類決定的,故而要求必須是String[]數(shù)組類型,所以打印一個(gè)Sub print和一個(gè)編譯提示參數(shù)類型不匹配編譯靜態(tài)錯(cuò)誤。
這是個(gè)重寫方法的特例,雖然編譯器允許這種特例,但是我們實(shí)際場(chǎng)景中最好還是不要編寫這樣的代碼,僅當(dāng)理解成Java變長(zhǎng)參數(shù)語(yǔ)法糖為了兼容數(shù)組類型的一種無法避免的遺留問題吧。因?yàn)闃?biāo)準(zhǔn)的方法重寫必須滿足如下條件:
重寫方法不能縮小訪問權(quán)限,可擴(kuò)大;
形參列表必須與被重寫方法相同;
返回類型必須與被重寫方法的相同或是其子類型;
重寫方法不能拋出新異常或者超過父類方法范圍的異常,可以拋出更少或者不拋出異常;
以上就是動(dòng)力節(jié)點(diǎn)java培訓(xùn)機(jī)構(gòu)的小編針對(duì)“基礎(chǔ)教程之Java類的繼承練習(xí)題”的內(nèi)容進(jìn)行的回答,希望對(duì)大家有所幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743