Объекты классов, как и данные примитивных типов, могут передаваться в методы. Однако в данном случае есть одна особенность - при передаче объектов в качестве значения передается копия ссылки на область в памяти, где расположен этот объект. Рассмотрим небольшой пример. Пусть у нас есть следующий класс Person:
public class Program{ public static void main(String[] args) { Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changeName(kate); System.out.println(kate.getName()); // Alice } static void changeName(Person p){ p.setName("Alice"); } } class Person{ private String name; Person(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return this.name; } }
Здесь в метод changeName передается объект Person, у которого изменяется имя. Так как в метод будет передаваться копия ссылки на область памяти, в которой находится объект Person, то переменная kate и параметр p метода changeName будут указывать на один и тот же объект в памяти. Поэтому после выполнения метода у объекта kate, который передается в метод, будет изменено имя с "Kate" на "Alice".
От этого случая следует отличать другой случай:
public class Program{ public static void main(String[] args) { Person kate = new Person("Kate"); System.out.println(kate.getName()); // Kate changePerson(kate); System.out.println(kate.getName()); // Kate - изменения не произошло // kate хранит ссылку на старый объект } static void changePerson(Person p){ p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); } static void changeName(Person p){ p.setName("Alice"); } } class Person{ private String name; Person(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return this.name; } }
В метод changePerson также передается копия ссылки на объект Person. Однако в самом методе мы изменяем не отдельные значения объекта, а пересоздаем объект с помощью конструктора и оператора new. В результате в памяти будет выделено новое место для нового объекта Person, и ссылка на этот объект будет привоена параметру p:
static void changePerson(Person p){ p = new Person("Alice"); // p указывает на новый объект p.setName("Ann"); // изменяется новый объект }
То есть после создания нового объекта Person параметр p и переменная kate в методе main будут хранить ссылки на разные объекты. Переменная kate, которая передавалась в метод, продолжит хранить ссылку на старый объект в памяти. Поэтому ее значение не меняется.