詳解Object類中的方法
Object類中的方法。
- public final native Class<?> getClass()
- public native int hashCode()
- public boolean equals(Object obj)
- protected native Object clone() throws CloneNotSupportedException
- public String toString()
- public final native void notify()
- public final native void notifyAll()
- public final native void wait(long timeout) throws InterruptedException
- public final void wait(long timeout, int nanos) throws InterruptedException
- public final void wait() throws InterruptedException
- protected void finalize() throws Throwable
getClass():final方法,不允許子類重寫。返回當前執行時物件的Class物件。
hashCode():返回物件的雜湊值。
equals():比較兩個物件是否相等。Object類的預設實現,即比較兩個個物件的記憶體地址是否相等。
public boolean equals(Object obj) {
return (this == obj);
}
注意點:如果重寫了equals方法,通常有必要重寫hashCode方法。
clone():建立並返回當前物件的一份拷貝。由於Object本身沒有實現Cloneable介面,所以不重寫clone方法但是進行呼叫的話會發生CloneNotSupportedException異常。
toString():Object物件的預設實現,即輸出類的名字@例項的雜湊值的16進位制。
public String toString() {
return getClass().getName () + "@" + Integer.toHexString(hashCode());
}
notify():喚醒一個在此物件監視器上等待的執行緒(監視器相當於就是鎖的概念)。如果所有的執行緒都在此物件上等待,那麼只會選擇一個執行緒。選擇是任意性的,並在對實現做出決定時發生。一個執行緒在物件監視器上等待可以呼叫wait方法。
直到當前執行緒放棄物件上的鎖之後,被喚醒的執行緒才可以繼續處理。被喚醒的執行緒將以常規方式與在該物件上主動同步的其他所有執行緒進行競爭。例如,喚醒的執行緒在作為鎖定此物件的下一個執行緒方面沒有可靠的特權或劣勢。
notify方法只能被作為此物件監視器的所有者的執行緒來呼叫。一個執行緒要想成為物件監視器的所有者,可以使用以下3種方法:
- 執行物件的同步例項方法。
- 使用synchronized內建鎖。
- 對於Class型別的物件,執行同步靜態方法。
注意點:因為notify只能在擁有物件監視器的所有者執行緒中呼叫,否則會丟擲IllegalMonitorStateException異常。
notifyAll():喚醒在此物件監視器上等待的所有執行緒。
wait(long timeout)/wait(long timeout, int nanos)/wait():讓當前執行緒等待直到另外一個執行緒呼叫物件的notify或notifyAll方法,或者超過引數設定的timeout超時時間。
wait方法會讓當前執行緒(我們先叫做執行緒T)將其自身放置在物件的等待集中,並且放棄該物件上的所有同步要求。出於執行緒排程目的,執行緒T是不可用並處於休眠狀態,直到發生以下四件事中的任意一件:
- 其他某個執行緒呼叫此物件的notify方法,並且執行緒T碰巧被任選為被喚醒的執行緒。
- 其他某個執行緒呼叫此物件的notifyAll方法。
- 其他某個執行緒呼叫Thread.interrupt方法中斷執行緒T。
- 時間到了引數設定的超時時間。如果timeout引數為0,則不會超時,會一直進行等待。
finalize():Object類的預設實現是不進行任何操作,該方法的作用是例項被垃圾回收器回收的時候觸發的操作。
/**
* Called by the garbage collector on an object when garbage collection
* determines that there are no more references to the object.
*/
protected void finalize() throws Throwable {
}