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我们正在比较它。
答案 0 :(得分: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
是第一个'Louie'实例(以前为r2
),r2
是第二个。
PS我假设我不需要评论为什么new Robot("Huey",2,3) == new Robot("Huey",2,3)
返回false。
答案 1 :(得分:1)
通过
跟踪逻辑r1 = Huey
r2 = Louie#1
r3 = Louie#2
r1 = Louie#1
r2 = Louie#2
r3 = Huey
r1 == r2? r1是Louie#1,r2是Louie#2
答案 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
。
答案 3 :(得分:1)
不,指向对象的变量是引用。当执行r1 = r2时,r1指向r2指向的相同对象,并且在r2 = r3之后,r2指向r3指向的相同对象。因此,您将第二个Robot对象的内存地址与第三个Robot对象的内存地址进行比较,它们是不同的。如果你想要语义相等,你的Robot类必须覆盖equals()和hashCode(),看看:http://www.technofundo.com/tech/java/equalhash.html
答案 4 :(得分: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);
行内存管理器从堆中获取一些内存(例如它是M3内存)并写入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的原因。
答案 5 :(得分:0)
您要比较两个不同的Robot对象。使用必须在Robot类中重新定义的equals。