2012-02-01 8 views
7

私はJavaクラスの学生で、今日のJavaについて何かを学び、私の歯車を回しました。私は教師にどのように、そしてなぜそれを聞いたのか、彼はその行動について確信が持てませんでした。誰も次の例がなぜ機能するのか説明できますか?Javaスコープ:メソッド内でインスタンス化されたオブジェクトを返す - それは危険ですか?

class Example { 
    public int ex_val; 

    public Example (int a) { 
     this.ex_val = a; 
    } 

    public int getExVal() { 
     return this.ex_val; 
    } 
} 

私は別のクラスと「リターン」オブジェクトのメソッド内で「例」のインスタンスを作成した場合、それは成功し、それのうちのジャンプは、元の範囲だし、その後使用することができます。

class ParentObject { 
    // Instance Variables  
    public Example a; 

    public ParentObject (int number) { 
     // Initialize instance variable object from out-of-scope instantiation 
     this.a = genExample(number); 

     // Verify scope creep 
     System.out.println(this.a.getExVal()); 
    } 

    public Example genExample (int a) { 
     return new Example(a); 
    } 
} 

これは機能しますが、この動作は安定していますか?これに数えることはできますか?ガベージコレクタは、あるメソッドのreturn文と呼び出し関数の代入文の間にジャンプできますか?私のOSのバージョンのJVMに基づいて、障害の危険性を実行していますか?それが信頼できるなら、これは便利な機能のように思えます。

+0

あなたがここで何を求めているのか分かりません。 「元の範囲から飛び降りる」とはどういう意味ですか?あなたはC++プログラマーですか? –

+2

あなたはライフタイムとスコープを混同しています。スコープは変数に、ライフタイムはオブジェクトに関係すると考えてください。 –

答えて

9

これは、Javaで行うのが一般的で信頼できるもので、ガベージコレクタはライブ参照がないとすぐにオブジェクトをクリーンアップすることを信頼します。これはOS依存でもJVM依存でもありません.JVMはこれで問題ありません。

3

これは完全に正常です。

まだaフィールドで参照されているので、ガベージコレクタは収集できません。

C++とは異なり、Javaオブジェクトは決してそれらを作成したスコープにリンクされません。

+0

"C++とは異なり、Javaオブジェクトは決してそれらを作成したスコープにリンクされません。"それは間違っています。オブジェクトが関数本体内で作成され、そのオブジェクトへの参照がリターン引数の形や他の手段で「漏出」されていない場合、その存続期間は作成されたスコープにリンクされます範囲外です。ガベージコレクションの対象となります。その最後の行を言い換える必要があるかもしれません。 – eternaln00b

+0

@SiddharthaShankar:これは当てはまりますが、オブジェクトはスコープに明示的に_リンクされていません。むしろ、同じ生涯が起こるだけです。 – SLaks

関連する問題