@Dmitry07

Почему изменение копии int'а не всегда меняет исходный int?

Доброго времени суток.

Имеются два примера, в рамках которых мы работаем с копией int-переменной. В первом примере изменение копии int'а меняет исходный int:

class Person{
	String name;
	int age;
	Person(String s, int i){
		name = s;
		age = i;
	}
}
class Test{
    public static void main(String args[]){
    	Person p1 = new Person("John", 22);
    	Person p2 = new Test().change(p1);
    	System.out.println(p1.name + " " + p1.age);
    	System.out.println(p2.name + " " + p2.age);    	
    }
    private Person change(Person p){
    	Person p2 = p;
    	p2.age = 25;
    	return p2;
    }
}

Итоговый результат:

John 25
John 25

то есть теперь p1.age также указывает на '25'. Тем не менее, во втором случае:

class Test{
	public static void main(String args[]){
		int x = 10;
		int y = new Test().change(x);
		System.out.println(x);
		System.out.println(y);
	}
//В примере параметром метода является int x, что немного путает с толку. Может быть любой буквой.
	int change(int x){
		x = 12;
		return x;

получаем итоговый результат:

10
12

то есть x по-прежнему указывает на '10'. С чем может быть связано такое различие?

Благодарю.
  • Вопрос задан
  • 204 просмотра
Решения вопроса 1
Therapyx
@Therapyx
Data Science
Вариант 1: Смотри, ты создал в куче обьект с адресом "пусть будет 111", после чего ты присваеваешь этот адресс 2ому обьекту. Получается, что обьект 2 имеет тот же адрес "111", потом ты в этом адрессе "111" меняешь возраст на 25, соответственно оба обьекта становятся с адрессом 111.

Вариант 2: х = 10 это локальная переменная, если ты ее передаешь дальше, то, чтобы ты с ней не делал - в мейне она останется 10. Ты ее изменил на 12 в функции change и 12 она только там, нигде более, после чего ты возвращаешь просто значение 12, которое инициализирует переменную y.

Понятно? Или что-то побробнее рассказать? ))
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alsopub
@alsopub
Простые типы передаются по значению, а сложные по ссылке.
Или я чего-то не рассмотрел в коде.
В первом случае вы передали не объект, а ссылку на объект, и его изменили через ссылку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы