2010-10-31 65 views
2

根據我所讀到的,該程序唯一可能的輸出是"A"或者沒有打印輸出。但是由於new MyString("A").concat("B");語句創建了一個新的對象,字符串爲"AB",這個對象是不是也被垃圾收集,導致輸出"AB"爲什麼「A」或沒有輸出只有這個代碼可能的輸出,它也可能是「AB」?

class MyString { 

    private String str; 
    MyString(String str) { this.str = str; } 
    public void finalize() throws Throwable { 
     System.out.print(str); 
     super.finalize(); 
    } 
    public void concat(String str2) { 
     this.str.concat(str2); 
    } 
    public static void main(String[] args) { 
     new MyString("A").concat("B"); 
     System.gc(); 
    } 
} 

回答

3

'AB'不會被輸出,因爲連接不會改變'str'的內容。連接只產生一個新的字符串'AB',它不被分配給任何東西,因此丟失。

爲了產生AB作爲打印,則需要在字符串(假設)的finalize方法寫的System.out

輸出可以是A噹噹前對象被垃圾收集,STR已初始化爲「 A「

+0

好吧,因爲此.str.concat(str2)將在內存」AB「中創建一個單獨的字符串,而不是引用它的對象MyString中的str。但是如果我們有了這個語句this.str + = str2;那麼在finalize方法中打印「AB」的可能性會存在嗎? – user439526 2010-10-31 07:07:34

+0

是的,那麼可能性存在 – 2010-10-31 07:08:49

7

字符串是不可變的。您的行this.str.concat(str2);幾乎沒有什麼,並且可能已經閱讀str = this.str.concat(str2);或簡單地str += str2

但是由於語句new MyString(「A」)。concat(「B」);正在創造一個新的對象...

是的。臨時String"AB")作爲返回值在內部創建並拋出。

...與字符串「AB」,不能這個對象也垃圾收集導致輸出「AB」?

不,因爲它創建了String而不是MyString字符串在它們的終結器(或其他任何方法)中不會打印任何內容。

相關問題