7

Java でオブジェクトを初期化する方法に関する記事には、以下の段落がありました。

オブジェクトの存続期間の開始時に、Java 仮想マシン (JVM) は、オブジェクトのインスタンス変数を収容するのに十分なメモリーをヒープに割り当てます。ただし、そのメモリが最初に割り当てられるとき、そこに含まれるデータは予測できません。メモリをそのまま使用すると、オブジェクトの動作も予測できなくなります。このようなシナリオを防ぐために、Java は、メモリがコードによって使用される前に、少なくとも予測可能なデフォルト値にメモリが初期化されるようにします。

unpredictable dataand unpredictable behaviorhere の意味を誰かが親切に説明できますか。前もって感謝します

4

4 に答える 4

6

ここで予測不可能なデータと予測不可能な動作が何を意味するのか、誰でも親切に説明できますか?

C/C++ でプログラミングした場合、初期化されていない変数が、変数のデータ型に従って解釈された、それに割り当てられたメモリ位置に存在するガベージ値を持っていることに気付くでしょう。コンパイラはそのような変数について文句を言うことはありません。開発者がそれらを適切に初期化するのを忘れると、ガベージ値が使用され、プログラムの予期しない動作が発生します。

Java では、JVM は変数のデータ型に基づいてすべてのメンバー変数をデフォルト値に初期化し、コンパイル中に初期化されていないローカル変数について不平を言うことで、このような予期しない動作を回避し、開発者が常に初期化された変数を使用するようにします。

于 2012-11-03T06:36:40.307 に答える
4

変数を初期化しないと、JVM は何を割り当てるかを理解できず、予測不能なデータになる任意の値を取るためです。

コンパイラは、初期化されていないローカル変数にデフォルト値を割り当てません。

ウィキペディアから:

Java には初期化されていない変数はありません。明示的な初期化子と配列の要素を持たないクラスとオブジェクトのフィールドは、それらの型のデフォルト値で自動的に初期化されます (boolean の場合は false、すべての数値型の場合は 0、すべての参照型の場合は null)。Java のローカル変数は、アクセスされる前に確実に割り当てられているか、コンパイルエラーです。

于 2012-11-03T06:32:18.020 に答える
4

この予測不可能性は、言語が変数を自動的に初期化しないC または C++ で発生する可能性があります。ウィキペディアからの一例を次に示します。

void count( void )
{
    int k, i;
    for (i = 0; i < 10; i++)
    {
        k = k + 1;
    }
    printf("%d", k);
}

http://en.wikipedia.org/wiki/Uninitialized_variable

kそれが最初にどのような価値を持っていたのかわからないので、わかりません。初期値は、割り当てられたメモリ ブロックに既に含まれているものです: 0x0A4C1330、または 0x00000000、または 0x00FF3333 など。

于 2012-11-03T06:38:11.127 に答える