#java #классы #объекты
Пример с сайта Quizful.net: public class Test { private void method1() { MyClass obj = new MyClass(); obj.x = 1; method2(obj); System.out.println("obj.x="+obj.x); } private void method2(MyClass param) { param.x = 2; param = new MyClass(); //1 param.x = 3; } class MyClass { int x; } public static void main(String[] args) { new Test().method1(); } } OUTPUT: obj.x=2 Вопросы: Почему 2, а не 3? Что за магия произошла в месте, которое я пометил //1единицей в комментариях?
Ответы
Ответ 1
param по сути является указателем на объект класса. param.x = 2; в этой строчке мы изменили объект, который был создан выше в method1 param = new MyClass(); param изменился, он указывает на новый объект. И у нового объекта мы меняем значение x. Но obj не менялся. Он по-прежнему указывает на первый объект!Ответ 2
Разбираем все по ОООПически: 1) Создается ссылка в куче для obj MyClass obj = new MyClass(); 2) Ссылка содержит указатель на значение в куче 1, присвоенное: obj.x = 1 3) Меняем содержимое на которое указывает ссылка obj на 2: param.x = 2; 4) Новый объект создается param , в ссылке obj по-прежнему 2 param = new MyClass(); //1 param.x = 3;
Комментариев нет:
Отправить комментарий