在這篇文章里我將介紹一些java對于對象的基本處理模式的問題。
首先看一個有關對象相等性(Object equivalence)的例子:
先看下面的代碼:
public class EqualTest1{
public static void main(String[] args){
Integer n1 = new Integer(20);
Integer n2 = new Integer(20);
System.out.PRintln(n1 = = n2);
System.out.println(n1 != n2);
}
}
程序的目的是輸出括號中的比較結果(boolean值),初次接觸Java的人很輕易的認為輸出結果為先true而后false。
但實際上結果是先false而后true,因為雖然兩個Integer對象的值是相同的,其reference卻不同。(注:有關reference的含義在我的上一篇學習筆記上有過介紹,這里不再贅述。)
為了解釋上面這個問題,我們應該了解Java對于對象的基本處理模式:
當你操作某個對象時,你所操作的其實是它的reference,比如A = B這個式子,就會將A和B都指向原來B所指向的對象,假如你改變了A的內容,那么同時也就更改了B的內容!因為A和B內含同一個object reference。
原先A中所儲存的reference,在賦值的過程中被覆寫了,實際上就是遺失掉了,因為垃圾回收器(garbage collector)會在適當時機清理該reference原本指向的那個對象。
那么如何知道對象的內容是否相等呢?這里就要用到equals(),請看下面的代碼:
public class EqualTest2{
public static void main(String[] args){
Integer n1 = new Integer(20);
Integer n2 = new Integer(20);
System.out.println(n1.equals(n2));
}
}
這樣輸出的就是我門所期望的true了。然后,事情并不會如此簡單,假如建立自有的class,那么事情會怎么樣呢?請看相面的代碼:
class Value{
int i;
}
public class EqualTest3{
public static void main(String[] args){
Value v1 = new Value();
Value v2 = new Value();
v1.i = v2.i = 20;
System.out.println(v1.equals(v2));
}
}
結果又輸出了false,這是為什么呢??
其實,equals()的缺省行為是拿reference來比較,所以除非在你的class中覆寫(override)equals(),否則不會得到預期的結果,而Java標準程序庫中的大多數class都覆寫了equals(),所以他們都會比較對象的內容是否相同,這樣一來,上面的問題就不難解決了。
有關覆寫(override)技術將在今后深入的文章中介紹:)
新聞熱點
疑難解答