知識(shí)點(diǎn):
- 靜態(tài)代碼塊只執(zhí)行一次 熬粗。
- kotlin 中每個(gè)次構(gòu)造函數(shù)都需要委托給主構(gòu)造函數(shù)翁巍,可以直接委托也可以通過(guò)其他的構(gòu)造函數(shù)間接委托。
- Java中 構(gòu)造函數(shù)不能被繼承,只能被子類調(diào)用弓叛。如果子類沒(méi)有用super顯示調(diào)用則會(huì)隱式調(diào)用父類構(gòu)造。如果父類沒(méi)有構(gòu)造诚纸,則會(huì)調(diào)用父類默認(rèn)構(gòu)造撰筷。
1. kotlin中
1.1 在kotlin中執(zhí)行順序
- 父類的靜態(tài)代碼塊 companion object
- 子類的靜態(tài)代碼塊
- 父類的主構(gòu)造函數(shù)
- 按定義順序執(zhí)行父類的init初始化塊兒和屬性初始化器
- 父類的次構(gòu)造函數(shù)
- 子類的主構(gòu)造函數(shù)
- 按定義順序執(zhí)行子類的init初始化塊兒和屬性初始化器
- 子類的次構(gòu)造函數(shù)
1.2 怎樣驗(yàn)證呢?
父類
public open class GenerParent(info: String) {
// 有參構(gòu)造
constructor(info: String, name: String) : this(info) {
println("GenerParent 次構(gòu)造函數(shù) $name $info ")
}
// 屬性初始化器 --- 在這里能輸出info的值說(shuō)明主構(gòu)造函數(shù)已經(jīng)執(zhí)行過(guò)了
var info: String =
info.also { println("GenerParent 中初始化info:$info") }
// 靜態(tài)代碼
companion object {
val PARNTID = 100001.also { println("GenerParent companion object ") }
}
}
子類畦徘,
在KOTLIN中每個(gè)次構(gòu)造函數(shù)都需要委托給主構(gòu)造函數(shù)毕籽,可以直接委托也可以通過(guò)其他的構(gòu)造函數(shù)間接委托抬闯。
public class GenerChild(info: String, var name:String) : GenerParent(info, name) {
// 無(wú)參構(gòu)造函數(shù)
constructor():this("default info", "default name"){
println("GenerChild 無(wú)參的次構(gòu)造函數(shù)")
}
// 有參構(gòu)造
constructor(info:String, id:Int):this(info, "default-name"){
println("GenerChild 的次構(gòu)造函數(shù) name ${name}")
}
// 屬性和init按定義的順序執(zhí)行,在主構(gòu)造函數(shù)之后关筒,次構(gòu)造函數(shù)之前
init {
println("GenerChild 初始化init代碼塊")
}
// 這個(gè)相當(dāng)于靜態(tài)代碼塊溶握,最先執(zhí)行 --1
companion object {
var CODE:Int = 888.also { println("GenerChild object combine 初始化") }
}
}
fun main(a:Array<String>){
GenerChild("對(duì)酒當(dāng)歌,人生幾何蒸播。", "曹操")
println("---------------------------------")
GenerChild("譬如朝露睡榆,去日苦多。", 1001)
println("---------------------------------")
GenerChild()
}
輸出:
GenerParent companion object
GenerChild object combine 初始化
GenerParent 中初始化info:對(duì)酒當(dāng)歌袍榆,人生幾何胀屿。
GenerParent 次構(gòu)造函數(shù) 曹操 對(duì)酒當(dāng)歌,人生幾何包雀。
GenerChild 初始化init代碼塊
---------------------------------
GenerParent 中初始化info:譬如朝露宿崭,去日苦多。
GenerParent 次構(gòu)造函數(shù) default-name 譬如朝露才写,去日苦多葡兑。
GenerChild 初始化init代碼塊
GenerChild 的次構(gòu)造函數(shù) name default-name
---------------------------------
GenerParent 中初始化info:default info
GenerParent 次構(gòu)造函數(shù) default name default info
GenerChild 初始化init代碼塊
GenerChild 無(wú)參的次構(gòu)造函數(shù)
// ---------------------------------------------------------------------
2. Java中
2.1 調(diào)用順序
- 父類中的靜態(tài)
- 子類中的靜態(tài)
- 父類構(gòu)造函數(shù)
- 子類構(gòu)造函數(shù)。如果子類中不用super調(diào)用父類構(gòu)造琅摩,則它會(huì)默認(rèn)先調(diào)用父類構(gòu)造
2.2 如何驗(yàn)證
父類
public class JavaParent {
JavaParent() {
System.out.println("JavaParent 構(gòu)造");
}
JavaParent(String info) {
System.out.println("JavaParent 有參構(gòu)造 " + info);
}
static {
System.out.println("JavaParent 靜態(tài)代碼塊");
}
}
子類
// 子類的構(gòu)造方法中如果不用super調(diào)用父類的構(gòu)造铁孵,它會(huì)默認(rèn)調(diào)用父類的構(gòu)造
public class JavaChild extends JavaParent {
JavaChild() {
System.out.println("JavaChild 構(gòu)造");
}
JavaChild(String info) {
System.out.println("JavaChild 有參構(gòu)造");
}
static {
System.out.println("JavaChild 靜態(tài)代碼塊");
}
}
// 調(diào)用
void main(){
new JavaChild()
System.out.println("--------------------------")
new JavaChild("java-info")
}
輸出
JavaParent 靜態(tài)代碼塊
JavaChild 靜態(tài)代碼塊
JavaParent 構(gòu)造
JavaChild 構(gòu)造
--------------------------
JavaParent 構(gòu)造
JavaChild 有參構(gòu)造
個(gè)人學(xué)習(xí)記錄用,有錯(cuò)誤請(qǐng)指出 <<<<<