为什么“A”或没有输出只能输出此代码,它也可能是“AB”?

时间:2010-10-31 06:52:35

标签: java garbage-collection

根据我所读到的,该程序唯一可能的输出是"A"或没有打印输出。但由于语句new MyString("A").concat("B");正在创建一个带有字符串"AB"的新对象,因此该对象也无法进行垃圾回收,从而导致输出"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();
    }
}

2 个答案:

答案 0 :(得分:7)

字符串是不可变的。您的行this.str.concat(str2);几乎没有任何内容,也许应该阅读str = this.str.concat(str2);,或只是str += str2

  

但是自语句新MyString(“A”)。concat(“B”);正在创建一个新对象......

是。临时String"AB")在内部创建为返回值并被丢弃。

  

...用字符串“AB”,这个对象也不能被垃圾收集,导致输出“AB”?

不,因为它会创建String,而不是MyString字符串在终结器(或任何其他方法)中不打印任何内容。

答案 1 :(得分:3)

'AB'不会是输出,因为连接不会改变'str'的内容。连接只产生一个新的字符串'AB',它没有分配给任何东西,因而丢失了。

要生成AB作为print,您需要在String的finalize方法中编写System.out(假设)

当当前对象被垃圾收集并且str已经初始化为“A”

时,输出可以是A.