兩個對象引用進行比較,比較的是這兩個對象的引用,而引用是在內(nèi)存中的一個地址。當然在這之前我們一定要清楚引用數(shù)據(jù)類型的堆棧二段式內(nèi)存管理模式。下面通過一個例子來掩飾引用間的比較。
public class Obj {
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
運行結果為: false
equals方法在這里比較的是對象的引用,用new關鍵字創(chuàng)建的對象地址是重新分配的,它們進行比較地址當然是不同的。
下面對上面的程序進行擴展:
public class Obj {
public String name;
public int age;
public void say(){
System.out.println("姓名:"+name+" 年齡:"+age);
}
public static void main(String [] args)
{
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
t3=t1;
if(t1.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
t1=t2;
if(t1.equals(t3))
{System.out.println("true");
}
else
{
System.out.println("false");
}
t1.say();
t2.say();
t3.say();
if(t3.equals(t2))
{System.out.println("true");
}
else
{
System.out.println("false");
}
}
}
運行結果如圖:
有關程序的具體執(zhí)行,通過圖例演示,如下:
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
創(chuàng)建Obj類的實例,在內(nèi)存中開辟存儲空間。
當執(zhí)行t3=t1;時,內(nèi)存中存儲形式變?yōu)椋?nbsp;
原來t3所指向的那塊堆內(nèi)存將變?yōu)椤袄薄S蒵ava垃圾回收機制自動回收。
if(t1.equals(t2))
{···· }
else
{···· }輸出結果當然為 false了。
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
執(zhí)行完這幾條語句后,內(nèi)存結果為:![clip_image001[37] clip_image001[37]](http://www.tkk7.com/images/blogjava_net/TinySK/WindowsLiveWriter/1bdef11c5df1_C4C4/clip_image001%5B37%5D_thumb.gif)
至于t1.say();和t2.say();這兩條語句的結果我就不用多說了吧,下面是關鍵部分,當執(zhí)行t1=t2;后內(nèi)存中存儲結果為:
![clip_image001[41] clip_image001[41]](http://www.tkk7.com/images/blogjava_net/TinySK/WindowsLiveWriter/1bdef11c5df1_C4C4/clip_image001%5B41%5D_thumb.gif)
最后執(zhí)行的那幾步應該就很清晰了,整個程序的流程到此結束。 |
| |