インスタンスの初期化


初期化順序

新しいJavaFXクラスのインスタンスは次の順序で初期化されます。

  • オブジェクトが生成されます。
  • Javaのスーパークラスのデフォルトコンストラクタが(もしあれば)実行されます。
  • オブジェクト式のインスタンス変数の初期化式が実行されます(が、設定はされません)。
  • JavaFXのスーパークラスのインスタンス変数が設定されます。
  • このクラスのインスタンス変数が辞書順で設定されます。
  • initブロックが(もしあれば)評価されます。この時点で、このインスタンスが初期化されます。
  • postinitブロックが(もしあれば)評価されます。

次の節でどうやってインスタンス変数が設定されるかを取り上げます。


インスタンス変数を初期化する手段

インスタンス変数の値は初期化の終わりで、いくつかの方法で設定されます。 オブジェクト式に用意されている値、変数宣言で指定されている初期値、override変数宣言の初期化式、または、 initブロックでの割り当て。これらの手段は以下で論じます。

クラスのインスタンスはオブジェクト式で生成されます。(new式とみなされます。なぜならこれらの目的は インスタンス変数を設定しないオブジェクト式と等価だからです。)

例:

var fu = Foo { x: 14 }

ここではFooのインスタンス変数 x がオブジェクト式で14に設定されます。 (注意:xはFooのスーパークラスで宣言されているかも知れません。)

インスタンス変数の明示的な、あるいは暗黙的な宣言は変数にデフォルト値を設定します。 例では明示的に設定されます。

class Foo {
   var x = 99;
}

ここでxは初期化式を持っています。

もし初期化式が用意されていなかったら、この型のデフォルト値は、インスタンス変数の型のデフォルト値になります。 型と値の章を参照してください。

例:

class Answers {
   var ungulate : Boolean;
}

falseはBoolean型のデフォルト値なので、ungulateのデフォルト値はfalseです。

override変数宣言はデフォルト値をオーバーライドできます。

例:

class Shed {
   var siding = "aluminum";
}

class FancyShed extends Shed {
   override var siding = "copper";
}

ここでFancyShedはsidingのデフォルト値をオーバーライドします。 初期化式を持たないoverride変数宣言はデフォルト値をオーバーライドしないことに注意してください。

確かに上の一つは初期地を設定します。もしオブジェクト式で値が用意されなかったら、それが使われるでしょう。 一方、もし変数のオーバーライドに初期化式があれば、それが使われるでしょう。 もし、それがオーバーライドされない場合、明示的な初期化式が初期値を与えます。 すべてが無い場合、型のデフォルト値が使われます。

上の一つがインスタンス変数を設定した後、initブロックが(もしあれば)実行されます。 このブロックはインスタンス変数を初期化できます。


Home