2012-02-01 80 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); 
    } 
} 

這樣做的工作,但是這種行爲是否穩定?我可以依靠這個嗎?垃圾收集器可以在一個方法的返回語句和調用函數的賦值語句之間跳轉嗎?基於我的操作系統版本的JVM,我是否有失敗的風險?如果可以信賴的話,這看起來像是方便的功能。

+0

不能說我明白你在問什麼。 「跳出原來的範圍」是什麼意思?你是C++程序員嗎? – 2012-02-01 22:46:19

+2

你把範圍和生命時間混淆了。將範圍看作與變量相關的變量,對象的生命週期。 – 2012-02-01 22:47:32

回答

9

這是一個在Java中完全正常,常見和可靠的事情,並且要做的事情是相信只要沒有任何實時引用,垃圾收集器就會清理該對象。這不依賴於操作系統或依賴於JVM:任何JVM都可以。

3

這是完全正常的。

垃圾收集器無法收集它,因爲它仍然由您的a字段引用。

與C++不同,Java對象從不鏈接到創建它們的範圍。

+0

,「與C++不同,Java對象從不鏈接到創建它們的範圍。」 - >這是不正確的。如果一個對象是在一個函數體內創建的,並且它的引用沒有以返回參數的形式或其他方式「泄漏出去」,那麼它的生命週期就會鏈接到它創建的範圍,即一旦該對象超出範圍,則有資格進行垃圾回收。您可能需要更改最後一行。 – eternaln00b 2012-02-02 02:55:42

+0

@SiddharthaShankar:雖然這是真的,但該對象並沒有顯式地鏈接到範圍。相反,它恰好有相同的一生。 – SLaks 2012-02-02 03:58:16