兩個對象引用進行比較,比較的是這兩個對象的引用,而引用是在內存中的一個地址。當然在這之前我們一定要清楚引用數據類型的堆棧二段式內存管理模式。下面通過一個例子來掩飾引用間的比較。
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關鍵字創建的對象地址是重新分配的,它們進行比較地址當然是不同的。
下面對上面的程序進行擴展:
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");
}
}
}
運行結果如圖:
有關程序的具體執行,通過圖例演示,如下:
Obj t1=new Obj();
Obj t2=new Obj();
Obj t3=new Obj();
創建Obj類的實例,在內存中開辟存儲空間。
當執行t3=t1;時,內存中存儲形式變為:
原來t3所指向的那塊堆內存將變為“垃圾”。由java垃圾回收機制自動回收。
if(t1.equals(t2))
{···· }
else
{···· }輸出結果當然為 false了。
t1.name="Tiny";
t1.age=20;
t1.say();
t2.name="SK";
t2.age=10;
t1.say();
t2.say();
執行完這幾條語句后,內存結果為:![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();這兩條語句的結果我就不用多說了吧,下面是關鍵部分,當執行t1=t2;后內存中存儲結果為:
![clip_image001[41] clip_image001[41]](http://www.tkk7.com/images/blogjava_net/TinySK/WindowsLiveWriter/1bdef11c5df1_C4C4/clip_image001%5B41%5D_thumb.gif)
最后執行的那幾步應該就很清晰了,整個程序的流程到此結束。 |
| |