2017-05-03 126 views
2

如果我有抽象類A用init方法:Init方法繼承

abstract class A(){ 
    init { 
    println("Hello") 
    }  
} 

然後B類,其延伸甲

class B(): A() 

如果我實例乙這樣

fun main(args: Array<String>){ 
    B() 
} 

A中的init方法是否仍然運行並打印出Hello

如果不是,我需要做些什麼來讓A的init方法運行?

+0

這個問題基本上是問如何運行一段代碼。只是在沙箱中檢查結果會不會更有效率? http://try.kotlinlang.org/ – voddan

回答

8

是的,基類的init塊在派生類實例初始化時運行。

在科特林,類似於Java中,一個類的實例在以下方式構造:

  1. 的對象被分配。

  2. 該類的構造函數被調用。 的(a)

    1. 如果類具有超類,執行類構建邏輯單元之前超類構造函數被調用;
      (即,點(a)中遞歸爲超類執行時,則執行從這裏繼續)

    2. 如果類具有屬性初始化或init塊,它們在相同的順序執行他們出現在課堂上;

    3. 如果構造函數有一個正文(即它是一個secondary constructor),那麼正文被執行。

在此描述中,你可以看到,當B構造,執行B初始化邏輯之前的A的構造函數被調用,並且,特別的A所有init塊被執行。

(runnable demo of this logic)


一個小的話就術語:init塊實際上不是一個單獨的方法。相反,所有init塊與成員屬性初始值設定項一起編譯到構造函數的代碼中,所以它們應該被認爲是構造函數的一部分。

+0

感謝您的演示! –