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, 00:26
Вот тебе примерчик:
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, 00:03
Большое спасибо за столь объемный ответ. Буду разбираться
physicist
Уровень 20
7 августа 2014, 22:47
Спасибо за разъяснения.
Но все же не совсем ясно как трактовать строчку
a = a + «more»;
Как я понимаю создается новый объект — строка, который будет доступен только внутри метода.
Ссылка a теперь указывает на другой объект. Но как понимает компилятор по какой ссылке выводить значение a?
И еще вопрос. Если все то же самое сделать для Integer( в методе например увеличивать на 1), то мы тоже будем получать исходные значения?
Sant9Iga
Уровень 41
7 августа 2014, 23:10
тут вступает в силу область видимости.
static void swap(String a, String b){
        a = a + " more";
        b = a;
    }

это одни строки.
а вот это:
String a = "One";
        String b = "Two";

другие. в принлтнах ты выводишь именно те строки которые в маине. а выбираются они по принципу самые близкие.
blacky
Уровень 23
7 августа 2014, 23:59
Спецификация JVM
Вот инфа по куче из спеки по JVM, это по фреймам, а это по стеку.
Переменные в языке Java делятся на два типа: простые и ссылочные. Ссылка указывает на область памяти, где размещаются данные объекта. Всем ссылочным переменным можно присвоить литерал null. Аналогией объявлению и инициализации переменной может служить собака с поводком.

Отличие переменных примитивного типа от ссылочного
Первым отличием является то, что переменные простого типа хранят фактические значения, а ссылочные переменные хранят адреса объектов, на которые они ссылаются.
Java - представление стека и кучи
Второе отличие состоит в том, как происходит передача данных при вызове метода. При передаче аргументов методам происходит копирование по значению. Т.е. в области видимости метода будет создана новая переменная. И если эта переменная простого типа, то будет скопировано фактическое значение, если она ссылочного типа, то будет скопирована ссылка. Т.е. при вызове метода создается фрейм, который хранит переданные данные в локальных переменных, а сам фрейм помещается в стек.
tanzwud
Уровень 34
8 августа 2014, 00:30
В java все копируется по значению.
www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html
А еще лучше всего зайти на
www.javaranch.com/campfire/StoryPassBy.jsp
Кстати классыне рисунки. Насклько я помню это из книги по подготовке к сертификации по яве хотя могу и ошибатся. Удачи в сдаче
blacky
Уровень 23
8 августа 2014, 00:52
Да-да-да, именно, это и хотел сказать =)
Картинки из книги "OCA Java SE 7 Programmer I Certification Guide" автора Mala Gupta.
blacky
Уровень 23
7 августа 2014, 22:14
В первом случае в метод передаются копии ссылок на неизменяемый объект. Что угодно с ними делай — константы останутся константами. Во втором случае в метод передаются копии ссылок на изменяемый объект.
Любой создаваемый объект хранится в куче, а ссылок на него может быть сколь угодно много. Соответственно, если состояние объекта можно изменить, то сделать это можно воспользовавшись любой из ссылок.
blacky
Уровень 23
7 августа 2014, 22:47