第七週動手動腦(2018.10.29-11.4)
阿新 • • 發佈:2018-11-07
動手動腦1:
執行 TestInherits.java 示例,觀察輸出,注意總結父類與子類之間構造方法的呼叫關係修改Parent構造方法的程式碼,顯式呼叫GrandParent的另一個建構函式,注意這句呼叫程式碼是否是第一句,影響重大!
執行截圖:
結論:通過 super 呼叫基類構造方法,必須是子類構造方法中的第一個語句。
動手動腦2:
請自行編寫程式碼測試以下特性:
在子類中,若要呼叫父類中被覆蓋的方法,可以使用super關鍵字。
package ceshi; class Animal { public int age=10; public String name; public void eat(){ System.out.println("吃東西"); } public Animal(int age){ this.age=age; System.out.println("執行了構造方法"); } } class Dog extends Animal{ public int age=20; public void eat(){ System.out.println("狗能吃骨頭"); } public Dog(int age){ super(age); System.out.println("Dog構造方法執行了"); } } package ceshi; public class Test { public static void main(String[] args){ Animal a=new Animal(10); a.eat(); Dog b=new Dog(20); b.eat(); } }
截圖:
動手動腦3:
答:
1.
2.
(1)子類物件可以賦值給父類的物件。父類進行子類強制轉換可以賦值給子類的物件。
(2)子類能覆蓋父類,但是父類中的變數的值是不改變的,訪問父類中的變數時可用super來訪問,反之則一直被子類覆蓋。父類被覆蓋時,對父類中的變數進行操作時,父類中的變數改變,但輸出時仍輸出覆蓋父類的子類的變數。
(3)(child)Parent.myValue++,這時改變的將是覆蓋父類的子類。
3.
當子類與父類擁有一樣的方法,並且讓一個父類變數引用一個子類物件時,到底呼叫哪個方法,由物件自己的“真實”型別所決定,這就是說:物件是子型別的,它就呼叫子型別的方法,是父型別的,它就呼叫父型別的方法。
這個特性實際上就是面向物件“多型”特性的具體表現。
如果子類與父類有相同的欄位,則子類中的欄位會代替或隱藏父類的欄位,子類方法中訪問的是子類中的欄位(而不是父類中的欄位)。如果子類方法確實想訪問父類中被隱藏的同名欄位,可以用super關鍵字來訪問它。
如果子類被當作父類使用,則通過子類訪問的欄位是父類的!