課堂(繼承與多態)動手動腦
01.怎樣判斷對象是否可以轉換?
答:可以使用instanceof運算符判斷一個對象是否可以轉換為指定的類型
02. 現在有三個類:
class Mammal{}
class Dog extends Mammal {}
class Cat extends Mammal{}
針對每個類定義三個變量並進行初始化
Mammal m=null ;
Dog d=new Dog();
Cat c=new Cat();
下列語句哪一個將引起編譯錯誤?為什麽?哪一個會引起運行時錯誤?為什麽?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
出現編譯錯誤:第二行,原因:不能將父類變量賦值給子類變量。
第四行,原因:繼承於同一個父類的兩個平行子類不能互相賦值。
出現運行錯誤:第五行,原因:在第一行中,m變量已經指向Dog對象,如果再執行c = (Cat)m,就是讓c指向Dog對象,而Cat和Dog之間不存在繼承關系,無法讓c指向Dog對象。
03.
運行 TestInherits.java 示例,觀察輸出,註意總結父類與子類之間構造方法的調用關系修改Parent構造方法的代碼,顯式調用GrandParent的另一個構造函數,註意這句調用代碼是否是第一句,影響重大!
通過 super 調用基類構造方法,必須是子類構造方法中的第一個語句。
04.
運行以下測試代碼
. 左邊的程序運行結果是什麽?
2. 你如何解釋會得到這樣的輸出?
3. 計算機是不會出錯的,之所以得
到這樣的運行結果也是有原因的,
那麽從這些運行結果中,你能總
結出Java的哪些語法特性?
答:
當子類與父類擁有一樣的方法,並且讓一個父類變量引用一個子類對象時,到底調用哪個方法,由對象自己的“真實”類型所決定,這就是說:對象是子類型的,它就調用子類型的方法,是父類型的,它就調用父類型的方法。
如果子類與父類有相同的字段,則子類中的字段會代替或隱藏父類的字段,子類方法中訪問的是子類中的字段(而不是父類中的字段)。如果子類方法確實想訪問父類中被隱藏的同名字段,可以用super關鍵字來訪問它。
如果子類被當作父類使用,則通過子類訪問的字段是父類的!
課堂(繼承與多態)動手動腦