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

use*_*526 2 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 7

字符串是不可变的.你的生产线this.str.concat(str2);几乎什么也没做,也许应该阅读str = this.str.concat(str2);,或者干脆str += str2

但自从声明新的MyString("A").concat("B"); 正在创建一个新对象......

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

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

不,因为它创造了一个String,而不是一个MyString.字符串在终结器(或任何其他方法)中不打印任何内容.