對(duì)于一個(gè)引用類(lèi)型的變量,Java編譯器按照它聲明的類(lèi)型來(lái)處理。
Base base = new Sub();
base.subMethod(); // 編譯出錯(cuò),Base基類(lèi),Sub子類(lèi),編譯器認(rèn)為base是Base類(lèi)型的引用變量,Base類(lèi)沒(méi)有subMethod()方法。這樣子,就必須使用強(qiáng)制轉(zhuǎn)換。(Sub)(base).subMethod();
對(duì)于一個(gè)引用類(lèi)型的變量,運(yùn)行時(shí)JVM按照它實(shí)際引用的對(duì)象來(lái)處理。
Base base = new Base();
Sub sub = (Sub)base; // 編譯通過(guò),但是運(yùn)行時(shí)拋出ClassCastException
在運(yùn)行時(shí),子類(lèi)的引用類(lèi)型變量可以轉(zhuǎn)換為父類(lèi)的引用類(lèi)型,而相反的過(guò)程卻不可以。
假定可以,即上邊兩行代碼運(yùn)行正常,那么sub.subMethod(); 執(zhí)行時(shí),JVM將找不到subMethod。sub實(shí)際引用的是Base類(lèi)的實(shí)例。
更多建議: