Когда блок finally выполняет buffer=buffer.concat("vvvv");
, он назначает новый String
локальной переменной buffer
, но метод возвращает исходный экземпляр String
, на который ссылалась buffer
, когда оператор return buffer;
был оценен.
Когда блок finally выполняет buffer.append("vvvv")
, он мутирует тот же экземпляр, который возвращается в операторе return buffer
, поэтому вы видите мутированный экземпляр, возвращенный методом.
Поведение первого метода эквивалентно:
StringBuffer buffer = new StringBuffer();
buffer.append("aa");
StringBuffer returned = buffer;
buffer.append("vvvv"); // mutates the same instance that will be returned
return returned;
Поведение второго метода эквивалентно:
String buffer = new String();
buffer=buffer.concat("aa");
String returned = buffer;
buffer=buffer.concat("vvvv"); // doesn't affect the returned instance
return returned;