копирование нулевой ссылки Java - PullRequest
5 голосов
/ 23 июля 2011

Простите, если это дубликат, я не могу найти ничего, что объясняет, что я вижу хорошо.

Следующая программа:

    Object a = new Object();
    Object b = a;

    System.out.println( "a: " + a );
    System.out.println( "b: " + b );

    a = null;

    System.out.println( "a: " + a );
    System.out.println( "b: " + b );

Выходит так:

a: java.lang.Object@3e25a5
b: java.lang.Object@3e25a5
a: null
b: java.lang.Object@3e25a5

Но ПОЧЕМУ?!? Я так смущен этим. Разве «b» не должно ссылаться на «a»? Следовательно, если «a» больше не ссылается на что-либо еще (например, ноль), то не должно ли «b»? Я явно упускаю что-то фундаментальное здесь.

Заранее спасибо.

РЕДАКТИРОВАТЬ # 1

Я думаю, что меня сбило с толку то, что я распечатывал адрес. По какой-то причине, по-моему, я распечатывал какое-то магическое значение, указывающее указатели \ ссылки - когда в действительности установка b = a не делает их одинаковыми, это просто создание нового указателя на то же место в куче. Я надеюсь, что это помогает кому-то еще.

Ответы [ 7 ]

8 голосов
/ 23 июля 2011

b не ссылается на a он ссылается на тот же объект a ссылается на то, когда было выполнено присваивание.

Я знаю, что это не тот же язык, но если вы знакомы с C , это как:

int someNum = 5;
int * a = &someNum; // a points to someNum
int * b = a; // b points to someNum too
a = NULL; // a doesn't point to anything (points to address 0), b still points to someNum

(я использовал C, так как он дает более ясный вид адресов и ссылок)

4 голосов
/ 23 июля 2011

Давайте подробно рассмотрим, что происходит:

//A is pointing to a new Object lets assume memory location for 1 for simplicity
Object a = new Object();
//B is now also pointing to memory location 1
    Object b = a;

//Both print the same they are both pointing to memory location 1
    System.out.println( "a: " + a );
    System.out.println( "b: " + b );

//a is now pointing to null, but there is no change to b which is still pointing to memory location 1
    a = null;

    System.out.println( "a: " + a );
    System.out.println( "b: " + b );
3 голосов
/ 23 июля 2011

Java всегда передает по значению, вот и все.

2 голосов
/ 23 июля 2011
Object a = new Object();

Эта строка создает новый объект в куче и помещает ссылку в переменную a.

Object b = a;

Java передается по значению, поэтому эта строка передает / присваиваетзначение этой ссылки в переменной b.

a = null;

Это означает, что переменная a больше не должна указывать на это место в куче, а должна указывать в никуда.Но это не должно означать, что b нигде не указывает, поскольку мы передали ссылку значением , поэтому b все еще указывает на этот объект в куче.

Наблюдение за ключамиздесь передача по значению.Поскольку по сути мы фотокопировали значение a в b, изменение оригинала не повлияет на внешний вид фотокопии, поскольку она уже сделана.

1 голос
/ 23 июля 2011

a ссылается на новый объект (Object a = new Object())
b ссылается на тот же объект, что и (Object b = a)
a ничего не указывает (a=null)
b по-прежнему ссылается на объект

1 голос
/ 23 июля 2011

И a, и b являются ссылками на экземпляр объекта, который вы создали. Это означает, что оба указывают на одну и ту же область памяти. Затем вы уничтожаете одну из этих ссылок. Теперь указывает на ноль. Но и объект, и вторая ссылка на него b живы. Это то, что вы видите.

0 голосов
/ 23 июля 2011

null не является примитивным и рассматривается как объект, поэтому, когда вы вызываете a = null, a не будет ссылаться ни на что, пока b все еще ссылается на тот же объект new Object()

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