標籤:
繼承是所有OOP語言不可缺少的能成部分。但繼承並不只是複製基類的介面。當建立一個匯出類的對象時,該對象包含了一個基類的子物件。這個子物件與你用基類直接建立的對象是一樣的。二者的區別在於,後者來自於外部,而基類的子物件被封裝在匯出類對象內部。
對基類子物件的正確初始化順序之前不能說不知道,好像所有知道點都一樣,只是去看,就覺得自己掌握了,其實不是。那隻是當時的自以為。呵呵,眼高手低。今天看到相關的章節,翻翻又是覺得都是自己知道的呀。也許是對同一個知識點有過太多次這種想,於是今天決定不只是看,不只是自以為的知道。動動手敲些例子吧。做了開發三年半了,也不算是個菜鳥了吧。之前項目一直安排相當緊湊,三年多大多隻是在實現功能,趕進度。少知又少的去研究本質。現在處於項目空閑期也三四個月了。一度覺得應該迴歸本質好好書本及語言本質而不是一味的實現實現。好吧,開了個小差,迴歸正題。先看我敲的簡單不能基礎了的JAVA小樣本:
對基類子物件的正確初始化,僅有一種方法可以保證這一點,在構造器中調用基類構造器來執行初始化,而基類構造器具有執行基類初始化所需要的所有知識能力。Java會自動在匯出類的構造器中插入對基類構造器的調用。
預設構造器
package com.ebao.java.constructor;
public class ClassA {
ClassA(){
System.out.println("==============ClassA");
}
}
package com.ebao.java.constructor;
public class ClassB {
ClassB(){
System.out.println("==============ClassB");
}
}
package com.ebao.java.constructor;
public class ClassC extends ClassA {
ClassB cb = new ClassB();
public static void main(String[] arg){
ClassC cc = new ClassC();
}
}
運行結果:
//==============ClassA
//==============ClassB
由此看出執行個體一個類時,構建過程是從基類向下擴充。然後是成員對象。所以基類構造器總是會被調用且是在匯出類構造器之前被調用。
帶參數的構造器
上面的例子中都是預設構造器,也就是都是不帶參數的構造器。編譯器可以輕鬆的調用它們是因為不必考慮要傳遞什麼樣的參數的問題。但是如果沒有預設的基類構造器,或者想調用一個帶參數的基類構造器。就必須用super顯式地編寫調用基類構造器的語句,並配以適當的參數列表:
public class Game {
Game(int i){
System.out.println("---------------------Game");
}
}
package com.ebao.java.constructor;
public class BoardGame extends Game {
BoardGame(int i){
super(i);
System.out.println("--------------------BoardGame");
}
}
package com.ebao.java.constructor;
public class Chess extends BoardGame {
Chess(int i) {
super(i);
System.out.println("--------------------Chess");
}
public static void main(String[] arg){
Chess cs = new Chess(7);
}
}
運行結果:
---------------------Game
--------------------BoardGame
--------------------Chess
如果不在子類中顯示調用基類構造器或調用類基構造器不是第一句編譯報錯如下
java 編程思想之7.2.1初始化基類