0

チュートリアルのようにJavaで配列を宣言しようとしましたが、間違いがありました。これが私のコードです:

public class ArrayExample {

   private static final int SIZE = 15;

   /*   this works   */
   int[] arrayOfInt = new int[SIZE];

   /*  but this doesn't work, says "cannot find symbol"  */
   int[] arrOfInt;
   arrOfInt = new int[SIZE];


   public static void main(String[] args) {

      /*  but here it works; why? what's the difference? */
      int[] arrOfInt;
      arrOfInt = new int[SIZE];
   }
}

チュートリアルでこの違いの説明が見つかりませんでした。main2 番目の宣言が機能しないのに、メソッドの3 番目の宣言が機能するのはなぜですか?

4

4 に答える 4

3

クラス定義の一部として割り当てステートメントを記述することはできません。

最初のメソッドを使用する (推奨) か、割り当てをコンストラクターに移動します (この場合は必要ありませんが、オブジェクトが構築されるまでサイズがわからない場合は便利です。その後、パラメーターとしてに渡すことができます)。コンストラクター)。

int[] arrOfInt;

public ArrayExample()
{
    arrOfInt = new int[SIZE];
}
于 2012-05-13T16:26:15.513 に答える
1

あなたがこれをするとき

int[] arrayOfInt = new int[SIZE];

コンパイラはそれを読み取りarrayOfInt、それをで初期化することを覚えていますnew int[SIZE]

その瞬間に初期化はarrayOfInt起こりません。

これを行うとき:

int[] arrOfInt;
arrOfInt = new int[SIZE];

コンパイラは読み取りますarrOfIntが、2行目に達すると、arrOfIntのタイプが見つかりません。この時点で、コンパイラはすべての変数を読み取っていない可能性があるためarrOfInt、見つからないと表示されます。つまり、次の変数を読み取ったかどうかはチェックされません。まだ完全な処理が完了しておらず、初期化ブロックにないのと同じ名前です。あなたはまだコードの宣言ブロックにいます。

メソッドは宣言+初期化ブロックであるため、コンパイラーでは2つの異なるポイントで変数を宣言して初期化できます。

初期化には、コンストラクターまたはインスタンス初期化ブロックまたは静的初期化ブロックのいずれかを使用できます。

  • 静的初期化ブロックは、クラスがロードされるときに1回実行されます。
  • インスタンス初期化ブロックは、クラスのインスタンスが作成されるたびに実行され、クラスのコンストラクターでsuperの呼び出しが完了した後、クラスで定義されたとおりに実行されます。
于 2012-05-13T16:41:22.470 に答える
1

次のように、必要に応じてコンストラクターを使用せずに、クラス Anonymous コード ブロックに変数の初期化を挿入することもできます。

int[] arrOfInt;

 {
arrOfInt = new int[SIZE];
} 
于 2012-05-13T16:28:29.293 に答える
0

uは静的メソッドに非定常値を宣言できないため、これは間違っています

int []arrOfInt;
public static void main(String[] args) {
      arrOfInt = new int[SIZE];
}

あなたはこのようにそれを解決することができます

int []arrOfInt=new int[SIZE];
    public static void main(String[] args) {
    }
}

またはこのように

class ArrayExample{
   int []arrOfInt;
   public static void main(String args[]){
        ArrayExample a = new ArrayExample();
        a.arrOfInt=new int[a.SIZE];
   }
}
于 2012-05-13T16:41:14.867 に答える