11月1日的動手動腦
1.動手實驗:繼承條件下的構造方法呼叫
程式碼如下
class Grandparent { public Grandparent() { System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent extendsGrandparent { public Parent() { //super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child extends Parent { public Child() { System.out.println("Child Created"); } }public class TestInherits { public static void main(String args[]) { Child c = new Child(); } }
ok,我們來看一看輸出結果:
GrandParent Created.
Parent Created
Child Created
注意順序:是先祖父,再父親最後是兒子。也就是呼叫的時候會優先呼叫其父類的建構函式,兒子類的要排到後面了。而且看程式裡面有兩個super語句,super語句是專門用來呼叫前一個父類的方法,實驗可以得到,super的構造語句必須放在前面。
2.為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?
答:構造一個物件,先呼叫其構造方法,來初始化其成員函式和成員變數。子類擁有父的成員變數和成員方法,如果不呼叫,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。不能反過來呼叫也是這個原因.
3.神奇的“+”號
public class Fruit { public String toString() { return "Fruit toString."; } public static void main(String args[]) { Fruit f=new Fruit(); System.out.println("f="+f); // System.out.println("f="+f.toString()); } }
結果是:f=Fruit toString.
答:在“+”運算中,當任何一個物件與一個String物件,連線時,會隱式地呼叫其toString()方法,預設情況下,此方法返回“類名 @ + hashCode”。為了返回有意義的資訊,子類可以重寫toString()方法。
4.
請自行編寫程式碼測試以下特性(動手動腦): 在子類中,若要呼叫父類中被覆蓋的方法,可以使用super關鍵字:
class Parent { public void show() { System.out.println("123"); } } class Child extends Parent { public void show() { super.show(); System.out.println("321"); } } public class asd { public static void main(String [] args) { Child c = new Child(); c.show(); }
輸出結果是:
123
321
因為super方法在子類覆蓋方法類使用,只有這樣才能呼叫父類中被覆蓋的方法,並且super語句放在子類覆蓋方法的話位置就沒有要求了。
5.現在有三個類: 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;