動物是狗的超類,而狗有一種叫樹皮的方法public void bark(){ System.out.println("woof");}考慮以下:Animal a = new Dog();if (a instanceof Dog){ a.bark();}會發生什么?不允許分配允許調用樹皮,并在運行時打印“ woof”可以叫到樹皮,但不打印任何內容調用樹皮會導致編譯時錯誤調用樹皮會導致運行時錯誤我說2是因為我們正在檢查物體是否是狗;因為dog是其中包含bark方法的類,如果是,則將其調用,它將打印出:s我的理解在這里正確嗎?
3 回答

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

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