Object類下的方法總結
類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。所有物件(包括陣列)都實現這個類的方法。
在API檔案上Object類有9個方法:
經常會用到的方法
equals
equals用於指示其他某個物件是否與此物件“相等”。
在Object類中equals的方法體是
public boolean equals(Object obj) {
return (this == obj);
}
我們知道“==”在用於兩個物件比較的時候比較的是兩個物件的記憶體地址,所以在Object類下equals方法比較的是記憶體地址。
在String類中的equals的方法體是
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
研究String類中的equals方法體可以看到
第一步:使用“==”比較兩個物件的地址,地址若是一樣,那麼兩個物件的值也肯定相等,直接返回true,否則進入下一步;
第二步:使用instanceof方法檢視傳入物件anObject是否是String類的物件,結果為真就進入下一步的比較,否則直接返回false;
第三步:在驗證傳入物件anObject為String類物件後,將anObject強制轉換為String型別(其實我總覺得這個有點畫蛇添足,第二步已經驗證過了為什麼還要強制轉換,可能有什麼我沒有考慮到的地方把,畢竟是Java官方程式碼)。比較當前物件與傳入物件的長度,若兩物件的長度不等,返回false,若長度相等則進入下一步比較;
第四步:將兩個String類物件存入Char陣列中,之後逐個比較兩個陣列中的值,最後驗證兩個字串是否相等。
2.hashCode()
返回該物件的雜湊碼值 。預設情況下,該方法會根據物件的地址來計算。不同物件的hashCode()一般來說不會相同(也就是說二般情況下會相同,看了會資料有點蒙,先不管這個)。但是同一個物件的hashCode()值肯定相同。
System.out.println("該物件的雜湊碼值是:"+p1.hashCode());
該物件的雜湊碼值是:2018699554
3.toString()
返回該物件的字串表示
System.out.println("toString方法輸出物件的字串表示:"+p1.toString());
toString方法輸出物件的字串表示:com.hwadee.day0115.practice@7852e922
toString方法輸出的是包名.類名[email protected]+地址值
可以看到兩個方法都會輸出一個地址值,兩個值是可以相互轉換的
System.out.println("將hashcode值轉換為toString中的地址值: "+Integer.toHexString(p1.hashCode()));
將hashcode值轉換為toString中的地址值: 7852e922
執行緒中用到的方法
- void notify()
喚醒在此物件監視器上等待的單個執行緒。 - void notifyAll()
喚醒在此物件監視器上等待的所有執行緒。 - void wait()
在其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法前,導致當前執行緒等待。
其他不常用到的方法
- protected Object clone()
建立並返回此物件的一個副本。 - protected void finalize()
當垃圾回收器確定不存在對該物件的更多引用時,由物件的垃圾回收器呼叫此方法。 - Class
System.out.println("getClass()輸出"+p1.getClass());
System.out.println("p1.getClass().getName(): "+p1.getClass().getName());
getClass()輸出: class com.hwadee.day0115.practice
p1.getClass().getName()輸出: com.hwadee.day0115.practice