如果我有抽象類A用init方法:Init方法繼承
abstract class A(){
init {
println("Hello")
}
}
然後B類,其延伸甲
class B(): A()
如果我實例乙這樣
fun main(args: Array<String>){
B()
}
A中的init方法是否仍然運行並打印出Hello
?
如果不是,我需要做些什麼來讓A的init方法運行?
如果我有抽象類A用init方法:Init方法繼承
abstract class A(){
init {
println("Hello")
}
}
然後B類,其延伸甲
class B(): A()
如果我實例乙這樣
fun main(args: Array<String>){
B()
}
A中的init方法是否仍然運行並打印出Hello
?
如果不是,我需要做些什麼來讓A的init方法運行?
是的,基類的init
塊在派生類實例初始化時運行。
在科特林,類似於Java中,一個類的實例在以下方式構造:
的對象被分配。
該類的構造函數被調用。 的(a)
如果類具有超類,執行類構建邏輯單元之前超類構造函數被調用;
(即,點(a)中遞歸爲超類執行時,則執行從這裏繼續)
如果類具有屬性初始化或init
塊,它們在相同的順序執行他們出現在課堂上;
如果構造函數有一個正文(即它是一個secondary constructor),那麼正文被執行。
在此描述中,你可以看到,當B
構造,執行B
初始化邏輯之前的A
的構造函數被調用,並且,特別的A
所有init
塊被執行。
一個小的話就術語:init
塊實際上不是一個單獨的方法。相反,所有init
塊與成員屬性初始值設定項一起編譯到構造函數的代碼中,所以它們應該被認爲是構造函數的一部分。
感謝您的演示! –
這個問題基本上是問如何運行一段代碼。只是在沙箱中檢查結果會不會更有效率? http://try.kotlinlang.org/ – voddan