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