Почему «А» или нет вывода только возможные выходы этого кода, это также может быть «АБ»? - PullRequest
2 голосов
/ 31 октября 2010

Согласно тому, что я прочитал, единственными возможными выходами для этой программы являются "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 ]

7 голосов
/ 31 октября 2010

Строки неизменны. Ваша строка this.str.concat(str2); практически ничего не делает и, возможно, должна была прочитать str = this.str.concat(str2); или просто str += str2?

Но так как оператор new MyString ("A"). Concat ("B"); создает новый объект ...

Да. Временное String ("AB") создается внутри как возвращаемое значение и выбрасывается.

... со строкой "AB", не может ли этот объект быть также собранным мусором, что приведет к выводу "AB"?

Нет, потому что он создает String, а не MyString. Строки ничего не печатают в своем финализаторе (или любом другом методе в этом отношении).

3 голосов
/ 31 октября 2010

'AB' не будет выводом, потому что конкатенация не меняет содержимое 'str'. Конкатенация создает только новую строку «AB», которая ни к чему не привязана и, следовательно, теряется.

Чтобы создать AB в виде печати, вам нужно написать System.out в методе finalize строки (гипотетически)

Вывод может быть A, когда текущий объект является сборщиком мусора и str был инициализирован как "A"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...