1

Java や C# のように、参照を基本構造として使用する任意の OOP 言語を使用します。

高速実行のために、int や char などのプリミティブ型もサポートしています。これは、それらをスタックに格納することで行われると思います。およびヒープ上のオブジェクト タイプ。

だからこれのために:

class B
{
 ...
}

class A
{
   int a;
   B b;
}

Aa はスタックにありますか、それともヒープにありますか?

4

3 に答える 3

1
  • メソッドコードと静的フィールドを含むクラスオブジェクト:ヒープ。
  • インスタンスフィールドを含むオブジェクト:ヒープ。
  • ローカル変数とメソッドの呼び出し:スタック

ただし、java6の場合、オブジェクトがスタック上に作成される場合があります。

証明:http ://docs.oracle.com/javase/specs/jvms/se5.0/html/Concepts.doc.html#29375

于 2012-07-31T08:27:57.193 に答える
1

基本的な答えは、すべてのローカル変数がスタックにあり、他のすべてがヒープにあるということです。ただし、Java 7以降、コンパイラは、オブジェクトがメソッド内で厳密に使用されているかどうかをチェックする(そしてそのメソッドをエスケープしない)エスケープ分析と呼ばれる手法を実行し、そのようなオブジェクトを見つけると、そのストレージをスタック。この動作はJava6、Update 14で導入されましたが、デフォルトではアクティブ化されていません。

これは、他の多くの例と同様に、Java言語仕様が1つであり、実装が別のものであることを示しています。実装がJLSで定義されているように動作する限り、それは合法です。

于 2012-07-31T09:44:09.097 に答える
0

ローカル変数のみがスタックに格納され、その他はヒープに格納されます。

于 2012-07-31T08:29:24.007 に答える