3

クラス変数としてのオブジェクトはスタックオーバーフローを引き起こします

public class stack {
        stack obj = new stack();   // its obvious that during class loading obj will call class to
        // load and infinite loop will occur. 
}

staticクラスobjから使用しているとしましょう

public class stack {
      static stack obj = new stack();  // it will not cause infinite loop and program will //execute successfully
}

クラスが初めてJVMによってキャッチされると、静的変数がメモリに割り当てられます(私が知る限り)。staticJVMが上記のオブジェクト変数にメモリの割り当てを開始した場合にのみ、最初に言ってください。クラスを再びインターンコールし、これも無限ループを引き起こすはずです。どこかが間違っています。誰かが私が間違っている場所を強調できますか?

4

5 に答える 5

6

いいえ、と宣言してもstatic無限ループにはなりません。これが理由です。

静的変数は、クラスのロード時に初期化されます。したがって、クラスが初めて読み込まれると、コンパイラは静的変数のインスタンスを作成します。それだけです。これにより、クラスが再度読み込まれることはありません。クラスが再度読み込まれないため、このプロセスは繰り返されません。

非静的属性として宣言すると、まったく別の話になります。このことを考慮 -

public class stack {
    stack obj = new stack();

    ........
}

この宣言は次と同等です -

public class stack {
   stack obj;

    public stack() {
        obj = new stack();    // implicitly moved here by the compiler
    }

    ........
}

最後の例から、ここに無限再帰がある理由は明らかです。stack独自のコンストラクター内でクラスのインスタンスを作成しています。これにより、別のコンストラクターが作成され、さらに別のコンストラクターが作成され、さらにスタック オーバーフローが発生します。

于 2013-08-31T11:49:38.927 に答える
0

デバッグ中に、変数がクラスのインスタンスにすぎないため、最初に制御が静的変数に到達したときに、クラスの読み込みが呼び出されることを知ることができます。

次に、制御がクラスに入り、静的変数 object を見つけますが、この時点までに、JVM によってメモリアドレス値によって割り当てられます (他の静的変数に対して行われるように)。コントロールは変数をインスタンスとして無視するだけで、純粋に静的でプログラムが続行すると想定します。

于 2013-08-31T12:12:18.317 に答える
0

キーワード Static は無限ループとは関係ありません。フィールド、メソッド、クラス(静的内部クラス)を宣言できます

静的フィールド :-静的フィールドは、クラスが最初にロードされたときに作成および初期化されます。これは、クラスの静的メンバーが参照されたとき、またはクラスのインスタンスが作成されたときのいずれか早い方で発生します。

静的メソッド:- static キーワードで宣言されたメソッド。静的フィールドと同様に、静的メソッドは、クラスから作成された特定のオブジェクトではなく、クラス自体に関連付けられます。その結果、クラスによって定義された静的メソッドを使用する前に、クラスからオブジェクトを作成する必要はありません。

最もよく知られている静的メソッドは main です。これは、アプリケーションを開始するために Java ランタイムによって呼び出されます。メイン メソッドは静的である必要があります。つまり、アプリケーションはデフォルトで静的コンテキストで実行されます。

メモリの観点:-クラスが一度ロードされ、その定義が jvm の permgen 領域に格納されるため、静的変数もそこに格納され、jvm のライフサイクルの間存在します。

于 2013-08-31T11:59:47.493 に答える
0

クラスが初めて JVM にキャッチされると、静的変数がメモリに割り当てられます。

ではない正確に。

静的変数は、クラスがロードされるときに割り当てられます。

静的変数の初期化は、クラスの初期化時に実行されます。これは、クラスがロードされた後に発生する可能性があります。

JVMが上記の静的オブジェクト変数へのメモリの割り当てを開始した場合にのみ、最初に言ってください。クラスを再びインターンコールし、これも無限ループを引き起こすはずです。

いいえ。これは 2 つの理由で間違っています。

  • 一般に、オブジェクトは「インターン」されません。Interning はオブジェクトに対する操作であり、それでもString リテラルに対してStringのみ自動的に行われます。非リテラル String オブジェクトは、アプリケーションがString.intern() 明示的に呼び出す場合にのみインターンされます。

  • 何らかのインターンが自動的に実行されたとしても、これによって無限ループが発生することはありません。あなたは、インターンが何らかの形でクラスの初期化を再開または繰り返すと考えているようです。JVM は、各クラスがその存続期間中に最大1 回初期化されるように、かなりの時間を費やします。

于 2013-08-31T12:07:31.210 に答える