3 回答

TA貢獻1963條經(jīng)驗 獲得超6個贊
由于Animal沒有稱為bark的方法,因此無法編譯。這樣想,所有的狗都是動物,但并非所有的動物都是狗。所有的狗都吠叫,但不是所有的動物都吠叫。

TA貢獻1872條經(jīng)驗 獲得超4個贊
不,答案是;
4)調(diào)用樹皮會導致編譯時錯誤
樹皮方法未定義為分配的動物類型的方法,因此將導致編譯時問題;這可以通過鑄造來解決;
((Dog)a).bark();

TA貢獻1831條經(jīng)驗 獲得超10個贊
密鑰在以下行中:
Animal a = new Dog();
盡管Dog創(chuàng)建了一個新實例,但其引用a被聲明為類型Animal。因此,所有對的引用a都將new Dog作為處理Animal。
因此,除非Animal具有bark方法,否則以下行將導致編譯器錯誤:
a.bark();
即使a經(jīng)過測試是否是它的實例Dog并a instanceof Dog實際返回true,該變量a仍然是類型的Animal,因此if語句內(nèi)的塊仍然a作為變量處理Animal。
這是靜態(tài)類型語言的功能,在這種類型中,變量會提前分配類型,然后在編譯時檢查類型是否匹配。如果此代碼是在動態(tài)類型的語言(在運行時檢查類型)上執(zhí)行的,則可以允許以下內(nèi)容:
var a = new Dog();
if (a instanceof Dog)
a.bark();
a.bark()只能在實例為時執(zhí)行Dog,因此對的調(diào)用bark將始終有效。但是,Java是一種靜態(tài)類型的語言,因此不允許這種類型的代碼。
添加回答
舉報