Объекты как параметры методов

Последнее обновление: 19.04.2018

Объекты классов, как и данные примитивных типов, могут передаваться в методы. Однако в данном случае есть одна особенность - при передаче объектов в качестве значения передается копия ссылки на область в памяти, где расположен этот объект. Рассмотрим небольшой пример. Пусть у нас есть следующий класс 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, которая передавалась в метод, продолжит хранить ссылку на старый объект в памяти. Поэтому ее значение не меняется.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850