2010-10-23 2 views
0
Robot r1,r2,r3; 
r1=new Robot("Huey",2,3); 
r2=new Robot("Louie",5,4); 
r3=new Robot("Louie",5,4); 
r1=r2; 
r2=r3; 
r3=r1; 
System.out.print(r1==r2); 

Так что эта программа печатает ложные, но я думал, что это будет верно. Он спрашивает, совпадает ли адрес памяти r1 с r2. Ну r1 устанавливается равным r2, тогда r2 изменяется на r3, но это не имеет значения, правильно? Это все еще r2, с которым мы сравниваем это.Сравнивая адрес памяти объектов, Java

+0

Я говорю это часто, но это было бы очевидно, если бы вы использовали отладчик для ввода кода. –

+1

Адрес памяти? Ява? На самом деле 'r1 == r2' спрашивает, относятся ли к r1 и r2 к одному экземпляру. – Ishtar

ответ

3

Давайте посмотрим ситуацию после каждого задания

// r1 - Huey, r2 - Louie1, r3 - Louie2 
r1=r2; 
// r1 - Louie1, r2 - Louie1, r3 - Louie2 
r2=r3; 
// r1 - Louie1, r2 - Louie2, r3 - Louie2 
r3=r1; 
// r1 - Louie1, r2 - Louie2, r3 - Louie1 

В конце концов, r1 является экземпляр первого «Луи» (бывший r2) и r2 является вторым.

PS Я предполагаю, что мне не нужно комментировать, почему new Robot("Huey",2,3) == new Robot("Huey",2,3) возвращает false.

+0

О, хорошо, так вот, как бы я это сломал. Теперь, когда у вас есть комментарии r1 - Louie1, это будет считаться как r1 указывает на Louie1 правильно? – Snowman

+0

@fprime Да, «точки» - хорошее слово здесь. То есть, 'System.out.print (r1 == r3);' должен печатать 'true'. –

0

Вы сравниваете два разных объекта робота. Используйте equals, которые должны быть переопределены в классе Robot.

1

Проследить логику через

r1 = Huey 
r2 = Louie#1 
r3 = Louie#2 

r1 = Louie#1 
r2 = Louie#2 
r3 = Huey 

делает r1 == r2? r1 является Louie # 1, г2 Louie # 2

1

Вы можете визуализировать фрагмент как:

Initial  r1 -> Obj1, r2 -> Obj2, r3 -> Obj3 

After r1=r2 r1 -> Obj2, r2 -> Obj2, r3 -> Obj3 (Obj1 ready for GC) 

After r2=r3 r1 -> Obj2, r2 -> Obj3, r3 -> Obj3 

After r3=r1 r1 -> Obj2, r2 -> Obj3, r3 -> Obj2 

Ясно в конце r1 и r2 не относятся к одному объекту, следовательно, сравнивая их дает false.

1

Нет, переменные, указывающие на объекты, являются ссылками. Когда r1 = r2 выполняется, r1 указывает тот же объект r2, указывающий на и после r2 = r3, тогда r2 указывает тот же объект, на который указывал r3. Таким образом, вы сравниваете адрес памяти второго объекта Robot с адресом памяти третьего объекта Robot, и они разные. Если вы хотите семантическую equalilty ваш класс Робот должен переопределить равных() и хэш-код(), обратите внимание на: http://www.technofundo.com/tech/java/equalhash.html

1

В r1=new Robot("Huey",2,3); линии менеджер памяти занимает некоторую память из кучи (на примере это M1 памяти) и пишет там Robot("Huey",2,3) , И r1 относится к M1.

В r2=new Robot("Louie",5,4); диспетчер линейной памяти занимает некоторую память из кучи (например, это память M2) и пишет там Robot("Louie",5,4). А r2 относится к M2.

И, наконец, в r3=new Robot("Louie",5,4); диспетчер линейной памяти занимает некоторую память из кучи (например, это память М3) и пишет там Robot("Louie",5,4). И r3 относится к M3.

После r1=r2 команда r1 относится к M2. После r2=r3 команда r2 относится к M3. А после r3=r1 команда r2 относится к M2.

И когда вы пишете System.out.print(r1==r2), он пытается сравнить то, что относится к r1 и r2, это означает M2 и M3. Вот почему он возвращает false.

Смежные вопросы