根据我所读到的,该程序唯一可能的输出是"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();
}
}
答案 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.