第乙個例子:
class a
//該建構函式自始至終就沒有被呼叫過
public void print()
}class b extends a
//重寫父類中的print()函式
public void print()
}public class main
}
輸出:
null
asdg
總結:1.初始化c2()時,先初始化c2的父類:c1()
初始化c1()的靜態變數和靜態**塊
初始化c2()的靜態變數和靜態**塊
2.初始化c1()的非靜態變數,初始化父類的建構函式
如果父類的建構函式中呼叫的方法被子類重寫,那麼呼叫的會是子類的方法。
3.初始化c2()的非靜態變數,初始化子類的建構函式。
第二個例子:
public class a
public string s="aaaa";
//父類建構函式
public a()
public void call()
}class b extends a
//重寫父類中的call函式
public void call()
}
輸出:
null
bbbb
aaaa
總結:由於父類第一次呼叫子類的call方法時,子類還沒有初始化非靜態變數以及構造方法(靜態成員被初始化了),因此輸出是null。
通過父類的引用型別變數指向子類型別物件,訪問成員變數時是訪問的父類的成員變數。
(類載入時會為靜態變數賦初值,執行靜態**塊,但不會為例項變數賦初值,只有建構函式執行時才會賦值)
子父類中的建構函式
egclass fu class zi extends fu class extendsdemo3 列印結果為 fu show zi show 為什麼呢?因為在子類建構函式的第一行,有乙個隱式的語句 super 這句話是用於呼叫父類中那個空引數的建構函式,如果父類中只有空引數的建構函式就呼叫那個,如...
子父類中建構函式的特點
子父類中的建構函式 在對子類物件進行初始化時,父類的建構函式也會執行,那是因為子類的建構函式預設第一行有一條隱式的語句 super super 會訪問父類中空引數的建構函式,而且子類中所有的建構函式預設第一行都是super 為什麼子類一定要訪問父類中的建構函式?因為父類中的資料子類可以直接獲取,所以...
子父類中建構函式的特點
子父類中建構函式的特點 在子類構造物件時,發現訪問子類建構函式時,父類建構函式也執行了.為什麼呢?原因是 在子類的建構函式中第一行有乙個預設的隱式語句.super 子類的例項化過程 子類中所有的建構函式都會預設訪問父類中的空引數的建構函式.為什麼子類例項化的時候要訪問父類中的建構函式呢?那是因為子類...