固有の階層におけるscalaのオブジェクト初期化シーケンス
質問
私はJavaからscalaを初めて使用し、固有の階層でのscalaのオブジェクト初期化のシーケンスに混乱しています。 IIRC、Javaでは、サブクラスのオブジェクトが初期化されると、その基本クラスのコンストラクターが、それ自体のコンストラクターのコードの前に呼び出されます。 Scalaにいる間、私はまったく異なる行動を取ります。次の例を検討してください。 ジェネラコディセタグプレ
ColorPoint
とともにダンプされたjavap
のコンストラクターのバイトコードについて考えてみましょう。コードにキーステートメントprintln(name);
が含まれている場合、バイトコードは
ジェネラコディセタグプレ
フィールドmyColor
は、invokespecial
の後、つまり基本クラスの初期化後に初期化されていることがわかります。
ステートメントprintln(name);
をコメントアウトすると、バイトコードは次のようになります。
ジェネラコディセタグプレ
フィールドmyColor
は、invokespecial
の直前、つまりbaseが初期化される前に初期化されることがわかります。
では、その理由は何ですか?この種の動作を指定しているドキュメント/記事はありますか?
BTW、私のscalaのバージョンは2.7.7final(OpenJDK Server VM、Java 1.6.0_20)です。ありがとう、よろしく!
解決
コンパイラは単に順番に実行しているだけです。ここにいくつかのドキュメントがあります。
https://github.com/paulp/scala-faq/wiki/初期化-注文
その主要部分は次のとおりです。
- スーパークラスはサブクラスの前に完全に初期化されます。
- それ以外の場合は、宣言順に。