Javaコンストラクタでint配列を初期化します


90

私はクラスを持っています、そしてそのクラスでは私はこれを持っています:

 //some code
 private int[] data = new int[3];
 //some code

次に、私のコンストラクタで:

public Date(){
    data[0] = 0;
    data[1] = 0;
    data[2] = 0;
}

これを行えば、すべてが大丈夫です。デフォルトのデータ値が初期化されますが、代わりにこれを行う場合:

public Date(){
    int[] data = {0,0,0};
}

それは言う:

Local variable hides a field

どうして?

コンストラクタ内で配列を初期化する最良の方法は何ですか?


変数のスコープの概念をご存知ですか?data後の変数"//some code"はクラス全体のスコープを持っています。一方、dataコンストラクター内の変数は、コンストラクター内にスコープを持っています。コンストラクタが完了すると、変数は破棄されます。また、dataコンストラクター内の変数は、クラス内で同じ名前の変数を非表示にします。これはエラーを正当化しますLocal variable hides a field
Naveen Babu

回答:


178
private int[] data = new int[3];

これにより、配列要素はすでに0に初期化されています。コンストラクタでこれを繰り返す必要はありません。

コンストラクタでは、次のようにする必要があります。

data = new int[]{0, 0, 0};

はい。これが私に許可された唯一の方法でした。データだけを入れます。「それは声明ではない」と述べた。ありがとう
Favolas

data=new int[3]はデフォルトのコンストラクタで使用できませんDate()か?
パーサー2016

7

あなたはどちらかをすることができます:

public class Data {
    private int[] data;

    public Data() {
        data = new int[]{0, 0, 0};
    }
}

dataコンストラクタで初期化するか、または:

public class Data {
    private int[] data = new int[]{0, 0, 0};

    public Data() {
        // data already initialised
    }
}

dataコンストラクタのコードが実行される前に初期化します。


data = new int [] {0,0,0};と入力する必要があります。コンストラクタ内。データだけを入れてコンストラクタのコードの前に初期化すると、コンストラクター内で「ステートメントではない」エラーが発生しました
Favolas

配列に100万を超える要素がある場合。最初のコードを使用し、スローされるpublic Data() throws Error {場合OutOfMemoryErrorは行を変更します。
ニック、

4

これは、コンストラクターで、属性と同じ名前のローカル変数を宣言したためです。

すべての要素がゼロに初期化される整数配列を割り当てるには、これをコンストラクターに書き込みます。

data = new int[3];

他の初期値を持つ整数配列を割り当てるには、コンストラクタに次のコードを配置します。

int[] temp = {2, 3, 7};
data = temp;

または:

data = new int[] {2, 3, 7};

4

なぜ単純に

public Date(){
    data = new int[]{0,0,0};
}

エラーが発生した理由はint[] data = ...、新しい変数を宣言してフィールドを非表示にするためですdata

ただし、配列の内容はすでに0(デフォルト値int)に初期化されていることに注意してください。


1

コンストラクタで、別のint配列を作成しています。

 public Date(){
  int[] data = {0,0,0};
  }

これを試して:

 data = {0,0,0};

注:ちなみに、配列要素がインスタンス変数として宣言されている場合は、配列要素を初期化する必要はありません。インスタンス変数は自動的にデフォルト値を取得します。整数配列の場合、デフォルト値はすべてゼロです。

ローカルで配列を宣言した場合でも、各要素を初期化する必要があります。


0

最善の方法は、初期化ステートメントを記述しないことです。これはint a[]=new int[3]、デフォルトでJavaに書き込む と、配列のすべての値、つまりa[0]a[1]および!にa[2]初期化されるため0です。フィールドを非表示にするローカル変数については、結論を出すためにコード全体を投稿してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.