#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;
Комментариев нет:
Отправить комментарий