2010-10-31 69 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字符串在它们的终结器(或其他任何方法)中不会打印任何内容。

相关问题