2010-10-23 55 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

我經常這樣說,但如果您使用調試器來遍歷代碼,這將是顯而易見的。 – 2010-10-23 18:05:20

+1

內存地址? Java的?實際上,'r1 == r2'問是否r1和r2都指向同一個實例。 – Ishtar 2010-10-23 19:16:50

回答

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 2010-10-23 17:14:26

+0

@fprime是的,'點'在這裏是個好詞。即,'System.out.print(r1 == r3);'應該打印'true'。 – 2010-10-23 17:15:28

0

你是比較兩個不同的機器人對象。使用必須在Robot類中重新定義的等號。

1

跟蹤邏輯通過

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

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

確實R1 R2 = =? R1是路易#1,R2是路易#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 

顯然在年底r1r2沒有提及,因此比較他們給false同一個對象。

1

不,指向對象的變量是引用。當執行r1 = r2時,r1指向r2指向的同一對象,而r2 = r3後,r2指向r3指向的同一對象。因此,您將第二個Robot對象的內存地址與第三個Robot對象的內存地址進行比較,它們是不同的。如果你想語義equalilty你的機器人類必須重載equals()和hashCode(),來看看: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);行內存管理器從堆中取出一些內存(例如它是M3內存)並在那裏寫入Robot("Louie",5,4)。而r3是指M3。

r1=r2命令r1指的是M2。在r2=r3之後命令r2引用M3。命令r2指向M2後r3=r1

而當你寫System.out.print(r1==r2)它試圖比較r1和r2是指什麼,它意味着M2和M3。這就是爲什麼它返回false。