在這篇文章里我將介紹一些java對(duì)于對(duì)象的基本處理模式的問(wèn)題。
首先看一個(gè)有關(guān)對(duì)象相等性(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);
}
}
程序的目的是輸出括號(hào)中的比較結(jié)果(boolean值),初次接觸Java的人很輕易的認(rèn)為輸出結(jié)果為先true而后false。
但實(shí)際上結(jié)果是先f(wàn)alse而后true,因?yàn)殡m然兩個(gè)Integer對(duì)象的值是相同的,其reference卻不同。(注:有關(guān)reference的含義在我的上一篇學(xué)習(xí)筆記上有過(guò)介紹,這里不再贅述。)
為了解釋上面這個(gè)問(wèn)題,我們應(yīng)該了解Java對(duì)于對(duì)象的基本處理模式:
當(dāng)你操作某個(gè)對(duì)象時(shí),你所操作的其實(shí)是它的reference,比如A = B這個(gè)式子,就會(huì)將A和B都指向原來(lái)B所指向的對(duì)象,假如你改變了A的內(nèi)容,那么同時(shí)也就更改了B的內(nèi)容!因?yàn)锳和B內(nèi)含同一個(gè)object reference。
原先A中所儲(chǔ)存的reference,在賦值的過(guò)程中被覆寫(xiě)了,實(shí)際上就是遺失掉了,因?yàn)槔厥掌?garbage collector)會(huì)在適當(dāng)時(shí)機(jī)清理該reference原本指向的那個(gè)對(duì)象。
那么如何知道對(duì)象的內(nèi)容是否相等呢?這里就要用到equals(),請(qǐng)看下面的代碼:
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));
}
}
這樣輸出的就是我門(mén)所期望的true了。然后,事情并不會(huì)如此簡(jiǎn)單,假如建立自有的class,那么事情會(huì)怎么樣呢?請(qǐng)看相面的代碼:
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));
}
}
結(jié)果又輸出了false,這是為什么呢??
其實(shí),equals()的缺省行為是拿reference來(lái)比較,所以除非在你的class中覆寫(xiě)(override)equals(),否則不會(huì)得到預(yù)期的結(jié)果,而Java標(biāo)準(zhǔn)程序庫(kù)中的大多數(shù)class都覆寫(xiě)了equals(),所以他們都會(huì)比較對(duì)象的內(nèi)容是否相同,這樣一來(lái),上面的問(wèn)題就不難解決了。
有關(guān)覆寫(xiě)(override)技術(shù)將在今后深入的文章中介紹:)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注