3

私はJavaから2つのコードを持っています:

class Test1 {
  index = 1;
  int index;
}

class Test2 {
  { index = 1; }
  int index; 
}

最初のものはコンパイル時に失敗しました、それはメンバー「インデックス」が定義される前に使用されているためだと思いますか?2つ目はエラーがありません。理由がわかりません。少し時間を割いて私を助けてくれませんか?どうもありがとう!

4

3 に答える 3

7

2 番目のコードに存在する { ... } 内部構造はいわゆる初期化ブロックであるため、2 番目のコードはコンパイルされます。このブロックは、Java コンパイラによって各コンストラクタにコピーされます。

また、他のクラス メソッドと同様に、そのクラスで定義されたプロパティを使用できます。このプロパティが正確に定義されている場所 (このブロックの上または前) は問題ではありません。

最初のものは、基本的に7つの許可されたものを定義するクラス本体とメンバー宣言の言語仕様に単に適合しないため、コンパイルされません。

  1. InstanceInitializer (ここで使用される構成)
  2. StaticInitializer (first に似ていますが、クラスの読み込み時に実行されます)
  3. コンストラクタ宣言
  4. フィールド宣言
  5. メソッド宣言
  6. クラス宣言
  7. インターフェイス宣言
于 2012-09-12T16:43:42.877 に答える
2
class Test2 {
  { index = 1; }
  int index; 
}

上記のコード{ index = 1; }では として知られています。これは、クラスの静的変数の場合と同様に、クラスのインスタンス変数Instance initializer blockを初期化するために使用されます。 static initializer block

Java Compilerこのブロックを everyにコピーし constructor、すべてのコンストラクターがこのコード ブロックを簡単に共有できるようにします......

そのため、クラス内の の配置 (つまり、前または後) に関係なく、引き続きアクセスできます。instance variableInstance initializer block

このリンクを参照してください:

http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

于 2012-09-12T17:54:44.847 に答える
1

test2は、Initiallizerを使用するためにコンパイルされます。これは、コンストラクターを呼び出す前にinitiallizerが呼び出されるためにコンパイルされます。

于 2012-09-12T17:06:23.087 に答える