2017-05-03 25 views
2

私は、initメソッドを抽象クラスAを持っている場合:私はこのInitメソッドの継承

fun main(args: Array<String>){ 
    B() 
} 
のようにBのインスタンスを作成した場合

その後、
abstract class A(){ 
    init { 
    println("Hello") 
    }  
} 

とクラスB

class B(): A() 

を拡張

Aのinitメソッドがまだ実行され、Helloが印刷されますか?

もしそうでなければ、Aのinitメソッドを実行させるには何が必要ですか?

+0

この質問は、基本的にコードの特定の部分がどのように実行されるかを質問します。サンドボックスで結果を確認するほうが生産的ではないでしょうか? http://try.kotlinlang.org/ – voddan

答えて

8

はい、initの基本クラスのブロックは、派生クラスインスタンスが初期化されたときに実行されます。 Kotlinで

、同様にJavaへの、クラスのインスタンスは、以下のように構成されている:

  1. オブジェクトが割り当てられています。

  2. クラスのコンストラクタが呼び出されます。 (A)

    1. クラスは、スーパークラスを持っている場合、クラス構成ロジックが実行される前に、スーパークラスのコンストラクタが呼び出されます。
      (がスーパークラスのために再帰的に実行され、すなわち、ポイントは、(a)は、実行はここから継続)

    2. クラスは、プロパティ初期化子又はinitブロックを有する場合、それらは同じ順序で実行されています彼らはクラスのボディに現れます。

    3. コンストラクタにボディ(つまり、secondary constructor)がある場合、ボディが実行されます。この説明では

Bが構築されたとき、あなたは、それを見ることができますB初期化ロジックが実行され、そして、特に、Aの全てinitブロックが実行される前に、Aのコンストラクタが呼び出されます。

(runnable demo of this logic)


用語に小さな備考:initブロックが実際に別の方法ではありません。代わりに、すべてのinitブロックとメンバープロパティ初期化子は、コンストラクタのコードにコンパイルされるため、コンストラクタの一部と見なされるべきです。

+0

デモをありがとう! –