大二上第七週作業
執行結果:
總結:
1.有繼承類的情況下,在進行方法呼叫或函式構造時系統會先構造基類在構造父類最後在構造子類
2.通過 super 呼叫基類構造方法,必須是子類構造方法中的第一個語句。
問題:為什麼子類的構造方法在執行之前,必須呼叫父類的構造方法?能不能反過來?為什麼不能反過來?
1.建構函式主要用來在建立物件時初始化物件,即為物件成員變數賦初值
2.構造一個物件,先呼叫其構造方法,來初始化其成員函式和成員變數。
3.子類擁有父類的成員變數和成員方法,如果不呼叫,則從父類繼承而來的成員變數和成員方法得不到正確的初始化。
4.父類不能呼叫子類,因為父類不知道子類有什麼變數,而且子類得不到初始化的父類變數。
二、探索
public class ExplorationJDKSource { /** * @param args */ public static void main(String[] args) { System.out.println(new A()); } } class A{}
結果:
三、
package first; 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()); } }
執行結果:
原因:在“+”號運算時,當任何一個物件與String物件連線時,會隱式呼叫其toString()方法,預設情況下,此方法返回“類名@+hashCode"為返回有意義的資訊,子類可以重寫
四、多型
instanceof運算子判斷一個物件是否可以轉換為指定的型別
注意:Object是Java類庫中的頂層類,即所有類的父類;所以子類物件可以直接賦值給父類變數;即子類物件可以被當成父類物件來使用
五、方法覆蓋:自行編寫程式碼測試“在子類中,若要呼叫父類中被覆蓋的方法,可以使用super關鍵字
package second; /** * 父類B * @author ASUS * */ class B{ B(){ System.out.println("I am B."); } } /** * 子類A * @author ASUS * */ class A extends B{ A(){ super(); //呼叫父類的構造方法 } public static void main(String[] args){ new B(); //例項化類B的物件 } }View Code
注意:(1)覆蓋方法允許訪問範圍不能小於原方法
(2)宣告為final的方法不允許覆蓋
(3)不能覆蓋靜態static方法
六、多型性
(1)子類物件可以被當成父類或基類物件使用;如:Parent p=new Child();
即:更一般的物件可容納更具體化的物件。(類Object的物件可以被 所有類賦值)
package first; public class TestInstanceof { public static void main(String[] args) { //宣告hello時使用Object類,則hello的編譯型別是Object,Object是所有類的父類 //但hello變數的實際型別是String Object hello = "Hello"; //String是Object類的子類,所以返回true。 System.out.println("字串是否是Object類的例項:" + (hello instanceof Object)); //返回true。 System.out.println("字串是否是String類的例項:" + (hello instanceof String)); //返回false。 System.out.println("字串是否是Math類的例項:" + (hello instanceof Math)); //String實現了Comparable介面,所以返回true。 System.out.println("字串是否是Comparable介面的例項:" + (hello instanceof Comparable)); String a = "Hello"; //String類既不是Math類,也不是Math類的父類,所以下面程式碼編譯無法通過 //System.out.println("字串是否是Math類的例項:" + (a instanceof Math)); } }View Code
(2)父類物件賦值給子類變數必須進行強制型別轉換。
七、程式碼驗證
package second; class Parent { public int value=100; public void Introduce() { System.out.println("I'm father"); } } class Son extends Parent { public int value=101; public void Introduce() { System.out.println("I'm son"); } } class Daughter extends Parent { public int value=102; public void Introduce() { System.out.println("I'm daughter"); } } public class TestPolymorphism { public static void main(String args[]) { Parent p=new Parent(); p.Introduce(); System.out.println(p.value); p=new Son(); p.Introduce(); System.out.println(p.value); p=new Daughter(); p.Introduce(); System.out.println(p.value); } }View Code
結果:
自parent=child 語句後,parent 其實就是child;