2

私が知る限り、すべての静的変数と静的メソッドは静的になり、メソッドで宣言するすべてのメソッド、ローカル変数、および参照変数はスタックになりますが、静的メソッドのローカル変数と参照変数はどうですか?スタックに割り当てられると思いますが、どのように機能するのかわかりません。

例えば:

 public static void A(){
      int x = 3;
      Point p = new Point();
 } 

また、すべてのスレッドが静的を共有し、ヒープを共有していると思いますよね?

4

3 に答える 3

2

ローカル変数は、実行中のスレッドのスタックに常に割り当てられていると考えることができます。JITコンパイラはそれらをレジスタに最適化できると思いますが、意味的にはスタックに割り当てられた変数と区別できません。それらのスコープと有効期間は、関数の呼び出しごとにプライベートです。

また、静的変数 (クラス変数) とヒープについても質問します。クラス変数は、実行中のスレッドに関係なく、クラス変数への参照がすべて同じ変数を参照するという意味で、スレッド間で共有されます。ヒープ上に存在するオブジェクトについても同様です。

于 2012-05-21T19:20:12.307 に答える
1

静的メモリ領域と呼ばれるものはないと思います。プリミティブ型の変数ならスタックに、参照型ならオブジェクト自体はヒープに割り当てられますが、オブジェクトが置かれたアドレスを参照する変数はスタックに割り当てられます。ただし、静的変数の唯一の違いは、それらが最初に初期化され、JVM によって行われるため、他の変数の前に最初にスタックに割り当てられることです。

詳細について は、Java での静的割り当て - ヒープ、スタック、永続的な世代を参照してください。

于 2012-05-21T19:54:14.283 に答える
0

すべての定義は、現在のコンテキストでスタックに配置されます。基本的に、新しいコンテキストは、持っているたびにスタックにプッシュされ、持っている{ときにスタックからポップされます}。次に、特定のコンテキストで宣言されたすべての変数が、スタックの最上位にある現在のコンテキストに追加されます。コンテキストがポップされると、含まれているすべての定義が忘れられます。

これが機能する理由です。

public void method() {
    {
        int x = 0;
    }

    // x isn't defined here

    {
        int x = 0;  // This doesn't conflict with the previous declaration of x because we just created a new context and the other one was popped before.
    }
}
于 2012-05-21T19:24:35.040 に答える