23

Java に関する簡単な質問があります。インスタンス変数として int 配列があるとします。

int[] in = new int[5];

そのため、デフォルトでは 5 つのゼロが含まれています。しかし、ローカル変数と同じ配列がある場合はどうでしょう。ゼロに初期化されますか?それは宿題ではありません。私は Java 言語を学んでいます。よろしくお願いします

4

7 に答える 7

54

最初に理解しておくべきことは、ローカル変数はデフォルト値で明示的に初期化されないスタックに格納されるということです。インスタンス変数はヒープに格納され、デフォルトではデフォルト値で初期化されます。

また、インスタンス参照変数がその参照を保持しているか、ローカル参照変数を保持しているかに関係なく、オブジェクトHeap上に作成されます。


さて、次のように配列参照をローカル変数として宣言し、配列で初期化すると、次のようになります。

int[] in = new int[5];

配列参照はstack(in)に格納され、ヒープ上に5 つの整数要素を保持できる配列用にメモリが割り当てられます(オブジェクトはヒープ上に作成されることに注意してください) 次に、整数値を格納するための5 つの連続したメモリ ロケーションがHeapに割り当てられます。そして、配列オブジェクトの各インデックスは、それらのメモリ位置への参照を順番に保持します。次に、配列参照はその配列を指します。そのため、5 つの整数値のメモリがヒープに割り当てられるため、既定値に初期化されます。(size = 5)

また、配列参照を宣言し、配列オブジェクトで初期化しない場合: -

int[] in;

配列参照は(ローカル変数であるため)スタックnull上に作成されますが、インスタンス変数の場合のように、既定では配列に初期化されず、 にも初期化されません。


したがって、配列の宣言と初期化の最初の方法を使用すると、割り当ては次のようになります。

"Your array reference"
     "on stack"    

       |    |          "Array object on Heap"
       +----+                  
       | in |---------->  ([0, 0, 0, 0, 0])
       +----+
       "Stack"                  "Heap"
于 2012-11-22T11:36:25.013 に答える
5

あなたがするなら、それは同じことです:

int[] in = new int[5]インスタンス変数またはローカル変数として。どちらの場合も、配列オブジェクトinにはゼロが含まれます。

次のようなことをする場合の違いは次のとおりです。

  1. インスタンス変数: int[] in; ( nullで初期化されます)、inオブジェクトはheap spaceに存在します。

  2. ローカル変数 : int[] in; (ユーザーが初期化する必要があります)スタックに存在します

于 2012-11-22T11:35:43.437 に答える
3

プリミティブ型配列の場合、デフォルト値に初期化されます。ドキュメントには次のように書かれています:

指定された長さの 1 次元配列が作成され、配列の各コンポーネントがデフォルト値に初期化されます

整数型のデフォルト値は 0 です。

于 2012-11-22T11:37:46.030 に答える
2

はい、配列を初期化すると、内容はその型のデフォルト値に設定されintます.0になるため、参照型の場合はnull.

配列を初期化して内容を調べると、これを自分で確認できます。

...
final int[] in = new int[5];

for (int i = 0; i < in.length; i++) {
    System.out.println(in[i]);
}
...

これは印刷されます:

0
0
0
0
0
于 2012-11-22T11:35:57.937 に答える
1

はい

public void method() {
    int[] in = new int[5];
    System.out.pritnln(in[0]); //output in 0
}

この場合、配列はローカル変数であり、必要なのは配列を初期化することだけです。配列を初期化したら、配列要素**が**デフォルト値を取得します

于 2012-11-22T11:25:06.123 に答える
1

インスタンス変数またはローカル変数で宣言された配列がデフォルト値に初期化されるかどうかは実際には問題ではありません。

各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます。

JLSによると

An array initializer creates an array and provides initial values for all its components.

于 2014-01-05T09:36:05.970 に答える
0

配列をローカル変数としてインスタンス化すると、配列にゼロが 5 つ含まれません。

于 2012-11-22T11:25:17.107 に答える