Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Почему этот код выводит двойку?

#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;

Комментариев нет:

Отправить комментарий