2012-05-13 5 views
0

私はチュートリアルのようにJavaで配列を宣言しようとしていますが、間違いを受けました。ここに私のコードです:mainクラスまたはmainメソッドで配列を宣言することの違いは何ですか?

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]; 
    } 
} 

私はチュートリアルでこの違いの説明を見つけることができませんでした。なぜ2番目の宣言は機能しませんが、mainメソッドの3番目の方法は動作しますか?

+1

main()内で定義されたものはmain関数内のローカル変数に過ぎず、他の場所では使用できません。 main()関数の上で定義されたものは、クラスのメンバーになり、すべてのメソッドで使用できます。 –

答えて

3

クラス定義の一部として代入文を記述することはできません。

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

int[] arrOfInt; 

public ArrayExample() 
{ 
    arrOfInt = new int[SIZE]; 
} 
1

希望する場合も、この方法では、コンストラクタを使用せずに、クラス匿名コードブロックにあなたの変数の初期化を挿入することができます。

int[] arrOfInt; 

{ 
arrOfInt = new int[SIZE]; 
} 
0

uは静的にnonstaic値を宣言することはできませんこのような方法は、あなたがこの

int []arrOfInt=new int[SIZE]; 
    public static void main(String[] args) { 
    } 
} 
のようにそれを解決することができ

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

間違っています

またはこの

class ArrayExample{ 
    int []arrOfInt; 
    public static void main(String args[]){ 
     ArrayExample a = new ArrayExample(); 
     a.arrOfInt=new int[a.SIZE]; 
    } 
} 
1

のようなあなたはこの

int[] arrayOfInt = new int[SIZE]; 

を行うとコンパイラがarrayOfIntを読みますとnew int[SIZE]でそれを初期化するために覚えているでしょう。

arrayOfIntの初期化はその時点では起こりません。

あなたがこれを行う:

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

コンパイラはarrOfIntを読み取りますが、それは第二ラインに到達したとき、それはarrOfIntの種類を見つけるdoesntの、この時点でコンパイラを覚えて、それができないと言うので、すべての変数を読んだことがないかもしれませんがarrOfIntを見つけてください。つまり、完全な処理が完了しておらず、初期化ブロックに入っていないので、同じ名前の変数を読み込んでいないかどうかをチェックすることはありません。あなたはまだコードの宣言ブロックにいます。

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

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

  • クラスがロードされるときに静的初期化ブロックが1回実行されます。
  • インスタンスの初期化ブロックは、クラスのインスタンスが作成されるたびに実行され、クラスのコンストラクタでsuperの呼び出しが完了した後、クラスで定義されたとおりに実行されます。
関連する問題