2016-08-21 5 views
-4
class Test 
{ 
    int y=10; // defined as part of the class 
    Test obj1 =new Test(); 

public void function1(){ 
    int x = 5; // defined locally 
    Test obj2=new Test(); 
} 

    public static void main(String[] args) 
{ 
    Test obj = new Test(); 
} 
} 

私たちはすでにvaribale "y"がgonヒープになり、変数xがスタックになることを知っていますが、私の質問はどこにありますか?テストクラスへの参照はsvedされますか?ヒープやスタックに? 参照変数 "obj1"と "obj2"はスタックまたはヒープにどこに保存されますか?もちろん、オブジェクトはヒープになりますが、関数内で宣言されたときには参照変数はスタックになりますが、関数の外に宣言されたときはどうなりますか?混乱します。メソッドの外側に宣言されたJava参照変数は、スタックまたはヒープ上にあります。

+1

オブジェクトがスタックにあります。実際のテストオブジェクトはヒープになります。メソッド内で作成された参照はすべてスタックに移動します。 – TheLostMind

+0

@ TheLostMindどのようなメソッドの外に宣言されたobj1 sirについても、オブジェクトと一緒に参照変数obj1をヒープにする必要はありませんか? –

+2

私はDVDはしませんでしたが、私の印象は、Java言語仕様のいくつかの調査で簡単に答えられるタイプの質問であるということです。学習モードに入っているので、その優秀な文書の組織に慣れ始めると、将来の参考文献を探す場所を知ることができます。これはあなたの基本的な教育の一部です。ここで質問する前に、少なくともあなたはそれに努力をしてください。 –

答えて

3

obj1(参照)の値自体は、ヒープ上に割り当てられたTestのインスタンスの一部です。 obj1が指し示す値は異なるのインスタンスTestであり、ヒープ上にもあります。

メソッド内で宣言されたメソッドと変数へのパラメータのみがスタック上にあります。

new Test()の最初の呼び出しは、設定した再帰的な無限ループのため失敗します。新しいTestの各構成は、追加無制限のTestの構成を必要とします。メソッドの呼び出しがパラメータとローカル変数を持たなくてもスタックスペースを確保するので、おそらくStackOverflowErrorを取得します。

関連する問題