29
Сен
2017

После переназначения ссылки в методе на новый объект, переданная ссылка продолжает ссылаться на прежний объект

Пример с сайта 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единицей в комментариях?

UPDATE: правильный и короткий ответ - при вызове метода с непримитивным аргументом, в метод передаётся не объект, не ссылка, а копия ссылки на область памяти где этот объект хранится. Метод 2 компилятор понял (примерно) так:

 private void method2(MyClass param) { //Пусть param - исходная ссылка на объект
        MyClass paramCopy = param; //java работает на самом деле с копией переданной ссылки
        paramCopy.x = 2;
        paramCopy = new MyClass();  //1
        paramCopy.x = 3;
    }

Источник: https://ru.stackoverflow.com/questions/724729/%D0%9F%D0%BE%D1%81%D0%BB%D0%B5-%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%B2-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B5-%D0%BD%D0%B0-%D0%BD%D0%BE%D0%B2%D1%8B%D0%B9-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0-%D0%BF%D1%80%D0%BE%D0%B4%D0%BE%D0%BB%D0%B6%D0%B0

Share

Тебе может это понравится...