2014-03-28 23 views
1

在我的示例代碼中,我的Test對象中的哪些對象在執行結束時將有資格進行垃圾回收?什麼時候垃圾收集發生在這個Java代碼中?

interface Animal1 
{ 
    void makeNoise(); 
} 


class Horse implements Animal1 
{ 
    Long weight = 1200L; 

    @Override 
    public void makeNoise() 
    { 
     System.out.println("Whinny"); 
    } 
} 

public class Test extends Horse 
{ 
    public void makeNoise() 
    { 
     System.out.println("wginny"); 
    } 

    public static void main(String str[]) 
    { 
     Test t1 = new Test(); 
     Test t2 = new Test(); 
     Test t3 = new Test(); 
     t3 = t1; 
     t1 = t2; 
     t2 = null; 
     t3 = t1; 
    } 
} 
+4

你覺得呢? –

+1

如果您嘗試自己打印這些值以查看所得結果,則可能會將該概念更多地帶回家中。 – leigero

+4

我想問題是有多少資格在主要結束。答案是:自從該計劃退出後,他們都是... – assylias

回答

1
Test t1=new Test(); 
    Test t2=new Test(); 
    Test t3=new Test(); 
    t3=t1; 
    t1=t2; 
    t2=null; 
    t3=t1; 

答案是T3和T1。 t2仍然有一個存儲在t1中的引用,然後存儲到t3中。爲t1和t3創建的原始對象有資格進行垃圾回收,因爲不再有強引用,因爲不同的值已保存到它們。一個良好的心理鍛鍊,但這可能是你複製粘貼的作業。

一旦對其封閉對象的強引用消失,多頭符合條件都可以進行垃圾回收。

或者,如果您的應用程序退出,則所有對象都有資格進行垃圾回收。

+0

不要忘記'長'。 –

+0

多頭並不重要,它們都是Test派生類型的內部,我想你可以說他們都有資格進行垃圾回收,但這個問題的關鍵部分只是處理設置引用。 – rpg711

+1

這仍然是一個將被收集的對象......並且你的推理是錯誤的:原來的t1在最後仍然可以通過t3到達。 – assylias

0

不知道這是否是你問什麼,但我算6.

1: Test t1 original value 
2: Test t2 original value 
3: Test t3 original value 
4: Long t1.weight (autoboxed. not flyweighted because of the high value) 
5: Long t2.weight (autoboxed. not flyweighted because of the high value) 
6: Long t3.weight (autoboxed. not flyweighted because of the high value) 

注意,任何所謂的將只分配1方法flyweighted字符串。字符串是不可變的& Java將共享這些引用。

+1

makeNoise()永遠不會被調用,所以字符串永遠不會被創建。 –

+0

是否在這裏使用正確的術語?它不只是顯示這種行爲的字符串常量池嗎? – rpg711

+0

是的,這是正確的。字符串常量池是一種啓動字符串的機制。正如你指出的那樣,字符串將從字符串常量池中分配。多頭存儲不同,但目的是一樣的。 – Barett