Object類是Java類層次結構的根節點,定義了一些最抽象的方法。
registerNatives()
private static native void registerNatives();
static {
registerNatives();
}
是一個本地方法,並且該方法在靜態代碼塊中,因此所有對象在創建時,都會先調用該方法。該方法的主要作用就是將其他語言實現的(主要是C/C++)一些環境相關的方法映射到Java中的本地方法,實現方法名的解耦。
getClass()
public final native Class<?> getClass();
該方法也是一個本地方法,返回該對象的運行時類型,不可重寫。返回的Class對象的具體類型爲Class<? extends X>
,其中X是變量調用該方法的變量的被擦除的靜態類型。
hashCode()
public native int hashCode();
返回值爲對象的哈希值,用於支持哈希表。對於該方法的返回值,有一些通用的約定:
- 在同一個Java應用中調用同一個對象的
hashCode()
函數,只要equals()
方法中比較的信息沒有改變,那麼無論調用多少次,返回值都應該是相等的。 - 如果根據
equals()
方法,兩個對象是相等的,那麼這兩個對象的哈希值也應該是相等的。 - 雖然並沒有要求兩個不相等的對象(根據
equals()
方法)的哈希值必須不等,但是程序應該保證哈希值儘量稀疏以提高哈希表的性能。
equals()
public boolean equals(Object obj) {
return (this == obj);
}
用於比較另一個對象是否與當前對象“相等”,可由子類重寫。該方法應具有自反性,傳遞性,對稱性,冪等性。在Object
類中的默認實現比較的內存地址,即只有當兩個變量指向同一個對象時該方法才返回true
,在實際應用時通常需要重寫該方法以保證邏輯上的正確性。
clone()
protected native Object clone() throws CloneNotSupportedException;
創建並返回該對象的拷貝,“拷貝”的準確含義與該對象的類型有關。通常來說,該方法應該使得x.clone() != x
,x.clone().getClass() == x.getClass()
,x.clone().equals(x)
的結果均爲true
,但是並不是強制的要求。
該方法對對象實現的是“淺拷貝(shallow copy)”,而非“深拷貝(deep copy)”
- 淺拷貝:對基本數據類型進行值傳遞,對引用數據類型進行引用傳遞般的拷貝,此爲淺拷貝。
- 深拷貝:對基本數據類型進行值傳遞,對引用數據類型,創建一個新的對象,並複製其內容,此爲深拷貝。
對於一個具體類,如果想要調用其clone()
方法,該類需要實現Clonable
接口,否則會拋出CloneNotSupportedException
異常。
toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
發揮該對象的字符串表示,通常該字符串是對該對象的一個簡明、易讀的總結,所有的子類都應該重寫該方法。Object
類中的toString()
方法的返回值格式是:類型名@哈希值,其中哈希值是十六進制表示。
notify(), notyfyAll()
public final native void notify();
public final native void notifyAll();
notify()
隨機喚醒一個等待該對象的線程,notifyAll()
喚醒全部等待該對象的線程。線程如果想要調用這兩個方法,必須擁有該對象的監視器,線程可以通過以下幾種方法擁有對象的監視器:
- 執行對象的synchronized實例方法
- 執行一個synchronized代碼塊,用該對象作爲同步對象
- 如果是一個Class對象,那麼只要執行一個該類的同步靜態方法
wait(long timeout), wait(long timeout, int nanos), wait()
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
讓線程進入等待狀態,直到其他線程調用了該對象的notify()
方法或者nitifyAll()
方法或者經過了一定的時長。
finalize()
protected void finalize() throws Throwable { }
當垃圾回收器(Garbage Collector)確定不再有對該對象的引用時,由垃圾回收器在對象上調用該方法。該方法只會被調用一次。
Object類是Java類層次結構的根節點,定義了一些最抽象的方法。