2011-07-23 4 views
5

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

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

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: [email protected] 
b: [email protected] 
a: null 
b: [email protected] 

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

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

EDIT # 1

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

ответ

8

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, поскольку это дает более четкое вид адреса и ссылки)

+0

Спасибо. Безусловно, самое ясное объяснение - я знал, что мне не хватает чего-то достаточно очевидного; или, может быть, мне нужен был переподготовка, DOH! – javamonkey79

+0

Рад, что это получилось ясно :) – MByD

1

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

4

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

//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); 
1

который ссылается на новый объект (Object a = new Object())
б ссылается на тот же объект как (Object b = a)
ссылки ничего (a=null)
b все еще ссылки Объект

2
Object a = new Object(); 

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

Object b = a; 

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

a = null; 

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

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

3

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

0

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