Добрый день. Столкнулся с такой ситуацией.
Сначала посмотрел , выдаст этот код:
class anyexperiment{
public static void main(String[] args) {
// StringBuffer a = new StringBuffer("One");
// StringBuffer b = new StringBuffer("Two");
String a = "One";
String b = "Two";
swap(a,b);
System.out.println("a is " + a + "\nb is " + b);
}
static void swap(String a, String b){
a = a + " more";
b = a;
}
}
вывод:
a is One
b is Two
Но! Если его чуть чуть поменять , то получится совсем другой результат:
class anyexperiment{
public static void main(String[] args) {
StringBuffer a = new StringBuffer("One");
StringBuffer b = new StringBuffer("Two");
// String a = "One";
// String b = "Two";
swap(a,b);
System.out.println("a is " + a + "\nb is " + b);
}
static void swap(StringBuffer a, StringBuffer b){
a.append(" more");
b = a;
}
}
вывод:
a is One more
b is Two
Подскажите в чем прикол?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Программа выведет строку «John:Paul» дважды.
Но все же не совсем ясно как трактовать строчку
a = a + «more»;
Как я понимаю создается новый объект — строка, который будет доступен только внутри метода.
Ссылка a теперь указывает на другой объект. Но как понимает компилятор по какой ссылке выводить значение a?
И еще вопрос. Если все то же самое сделать для Integer( в методе например увеличивать на 1), то мы тоже будем получать исходные значения?
Любой создаваемый объект хранится в куче, а ссылок на него может быть сколь угодно много. Соответственно, если состояние объекта можно изменить, то сделать это можно воспользовавшись любой из ссылок.