質問

私は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/初期化-注文

その主要部分は次のとおりです。

  1. スーパークラスはサブクラスの前に完全に初期化されます。
  2. それ以外の場合は、宣言順に。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top