一、簡述
Object 類是除自己外所有 Java 類的終極父類。當然,數(shù)組也繼承了 Object 類。然而,接口是不繼承 Object 類的。因為編譯器會自動引入java.lang包中的類型,即import java.lang.Object, 沒必要聲明出來。Java 也沒有強制聲明“繼承 Object 類”。否則,就不能繼承除 Object 類之外別的類了,因為 Java 不支持多繼承。
Java 的任何類都繼承了這些方法,并且可以重寫/覆蓋不被 final 修飾的方法。例如,沒有 final 修飾的 toString() 可以被重寫,但是 final wait() 就不行。
二、clone()
clone() 的訪問權限是 protected,實現(xiàn)對象的淺復制,只有實現(xiàn)了 Cloneable 接口才可以調用該方法,否則拋出CloneNotSupportedException。
淺克隆(也叫做淺拷貝)僅僅復制了這個對象本身的成員變量,該對象如果引用了其他對象的話,不對其復制。Object 源碼中 clone() 的實現(xiàn):protected native Object clone() throws CloneNotSupportedException;
【native關鍵字】
簡單地講,一個 native method 就是一個 Java 調用非 Java 代碼的接口。native說明其修飾的方法是一個原生方法,方法對應的實現(xiàn)不是在當前文件,而是在用其他語言(如C和C++)實現(xiàn)的文件中。Java 語言本身不能對操作系統(tǒng)底層進行訪問和操作,但是可以通過 JNI 接口調用其他語言來實現(xiàn)對底層的訪問。
三、getClass()
final 方法,獲得運行時類型。
四、toString()
該方法用得比較多,一般子類都有重寫/覆蓋。
五、finalize()
該方法用于釋放資源。因為無法確定該方法什么時候被調用,很少使用。
Java 允許在類中定義一個名為 finalize() 的方法。它的工作原理是:一旦垃圾回收器準備好釋放對象占用的存儲空間,將首先調用其 finalize()。并且在下一次垃圾回收動作發(fā)生時,才會真正回收對象占用的內存。
六、equals()
一般 equals 和 == 是不一樣的,但是在 Object 中兩者是一樣的。子類一般都要重寫這個方法。
public boolean equals(Object var1) {
return this == var1;
}
equals() 和 == 運算符比較:
equals() 可以用來檢查一個對象與調用 equals() 的這個對象是否相等。雖然“==”運算符可以比較兩個數(shù)據(jù)是否相等,但是要來比較對象的話,恐怕達不到預期的結果。就是說,“==”通過是否引用了同一個對象來判斷兩個對象是否相等,這被稱為“引用相等”。這個運算符不能通過比較兩個對象的內容來判斷它們是不是邏輯上的相等。
七、hashCode()
該方法用于哈希查找,可以減少在查找中使用 equals 的次數(shù),重寫了equals()一般都要重寫hashCode()。這個方法在一些具有哈希功能的 Collection 中用到。一般必須滿足 obj1.equals(obj2)==true,可以推出obj1.hashCode()==obj2.hashCode(),但是hashCode相等不一定就滿足equals。不過為了提高效率,應該盡量使上面兩個條件接近等價。如果不重寫 hashcode(),在 HashSet 中添加兩個 equals 的對象(因為對象地址不一樣,會認為是 2 個不同的對象),會將兩個對象都加入進去。
八、wait()
wait() 就是使當前線程等待該對象的鎖,當前線程必須是該對象的擁有者,也就是具有該對象的鎖。wait() 一直等待,直到獲得鎖或者被中斷。wait(long timeout) 設定一個超時間隔,如果在規(guī)定時間內沒有獲得鎖就返回。調用該方法后當前線程進入睡眠狀態(tài),直到以下事件之一發(fā)生:
- 其他線程調用了該對象(Object)的 notify()。
- 其他線程調用了該對象(Object)的 notifyAll()。
- 其他線程調用了 interrupt 中斷該線程。
- 時間間隔到了。
此時該線程就可以被調度了,如果是被中斷的話就拋出InterruptedException。
九、notify()
該方法喚醒在該對象(Object)上等待的某個線程。
十、notifyAll()
該方法喚醒在該對象上等待的所有線程。