Как списки содержат ссылки на объекты / значения в Java? - PullRequest
0 голосов
/ 19 февраля 2019

Когда я добавляю объект в список и изменяю свойство объекта, это изменение будет распространяться на объект в списке, однако, когда я устанавливаю объект на ноль, я не получаю нулевой указатель от объекта в списке,Почему это?

public class Hworld {

    public static void main(String[]args) {

        List<Obj> list = new ArrayList<>();

        Hworld.Obj o = new Obj();

        list.add(o);

        for(Obj ob:list) {
            System.out.println(ob.b); // prints "base"
        }

        o.b="new";
        o=null;

        for(Obj ob:list) {
            System.out.println(ob.b); // prints "new"
        }

    }

    public static class Obj{

        String b = "base";

    }   
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Это потому, что Java использует ссылки .Когда вы создали объект o , новый объект, созданный в куче и o , теперь указывает на это местоположение, или o ссылается наадрес вновь созданного объекта.Теперь вы добавили объект o в список, так что список имеет ссылку на то же местоположение (на данный момент давайте назовем это местоположение).Теперь вы выполнили операцию dot . со ссылкой o , которая фактически изменяет значение переменной-члена в объекте.И теперь вы сделали ссылку o , чтобы указывать в никуда, или просто вы установили ссылку как null .Но в списке есть ссылка на то же место, вы не изменили эту ссылку.Таким образом, вы не получите никакого NPE, и вы получите значение, измененное ранее, используя оператор точка (.) .Надеюсь, я пролил немного света.

0 голосов
/ 19 февраля 2019

Вы создаете объект с именем o.Затем вы помещаете его в список, что означает, что в списке хранится ссылка на объект, который в данный момент хранится в o.Результат печати в цикле является основанием, потому что есть только один объект, у которого «база» хранится в b.

Затем вы изменяете o, устанавливая o в b как «новый».Поскольку o и объект, сохраненный в списке, одинаковы, изменение o также приводит к изменению объекта, сохраненного в списке.Это те же самые объекты.

Затем вы устанавливаете o в ноль.Это означает, что o теперь указывает на ноль, тогда как объект, сохраненный в списке, указывает на объект, изначально сохраненный в o.

Первоначально o указывает на A, вы добавляете o в список, так что список знает об Aне о.Если затем вы измените A, используя o, вы можете получить доступ к этому изменению, используя путь o к A и путь списка A. Затем вы задаете o, чтобы знать о B, список все еще знает об A, но ничего о B, потому что список хранитA, а не B. o Только был передатчик, чтобы получить знания об A в списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...