JavaRush /Java блог /Архив info.javarush /Влияние метода на параметры
physicist
20 уровень

Влияние метода на параметры

Статья из группы Архив info.javarush
Добрый день. Столкнулся с такой ситуацией. Сначала посмотрел , выдаст этот код: 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 Подскажите в чем прикол?
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
blacky Уровень 23
8 августа 2014
Вот тебе примерчик:
class Person { 
private String name; 
Person(String newName) { 
name = newName; 
} 
public String getName() { 
return name; 
} 
public void setName(String val) { 
name = val; 
} 
}
class Test { 
public static void swap(Person p1, Person p2) {
Person temp = p1; 
p1 = p2; 
p2 = temp; 
}
public static void main(String args[]) {
Person person1 = new Person("John");
Person person2 = new Person("Paul");
System.out.println(person1.getName() 
+ ":" + person2.getName());
swap(person1, person2);
System.out.println(person1.getName() 
+ ":" + person2.getName());
} 
}

Программа выведет строку «John:Paul» дважды.
physicist Уровень 20
8 августа 2014
Большое спасибо за столь объемный ответ. Буду разбираться
physicist Уровень 20
7 августа 2014
Спасибо за разъяснения.
Но все же не совсем ясно как трактовать строчку
a = a + «more»;
Как я понимаю создается новый объект — строка, который будет доступен только внутри метода.
Ссылка a теперь указывает на другой объект. Но как понимает компилятор по какой ссылке выводить значение a?
И еще вопрос. Если все то же самое сделать для Integer( в методе например увеличивать на 1), то мы тоже будем получать исходные значения?
blacky Уровень 23
7 августа 2014
В первом случае в метод передаются копии ссылок на неизменяемый объект. Что угодно с ними делай — константы останутся константами. Во втором случае в метод передаются копии ссылок на изменяемый объект.
Любой создаваемый объект хранится в куче, а ссылок на него может быть сколь угодно много. Соответственно, если состояние объекта можно изменить, то сделать это можно воспользовавшись любой из ссылок.