Object 源碼閱讀
/**
* Object 類是類繼承結構的根類,每個類型都以 Object 做爲其父類,包括數組。
*/
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
/**
* 建立一個新的對象
*/
@HotSpotIntrinsicCandidate
public Object() {}
/**
* 返回此對象的目標 Class 對象
*/
@Override
@HotSpotIntrinsicCandidate
public final native Class<?> getClass();
/**
* 返回此對象的哈希值
* 若是兩個對象的 equals(Object) 方法返回 true,則它們的哈希值必須相等。
*/
@Override
@HotSpotIntrinsicCandidate
public native int hashCode();
/**
* 此對象是否和目標對象 obj 相等
* 1)反射性:對於任何非空引用 x,x.equals(x) 應該返回 true。
* 2)對稱性:對於任何非空引用 x、y,若是 x.equals(y) 返回 true,則 y.equals(x) 也應該返回 true。
* 3)傳遞性:對於任何非空引用 x、y、z,若是 x.equals(y) 和 y.equals(z) 返回 true,則 x.equals(z) 也應該返回 true。
* 4)一致性:對於任何非空引用 x、y,則屢次調用 x.equals(y) 應該一致地返回 true 或 false。
* 5)對於任何非空引用,x.equals(null) 應該返回 false。
* 若是重寫了 equals 方法,則必須重寫 hashcode 方法。
*/
public boolean equals(Object obj) {
return this == obj;
}
/**
* 克隆此對象
*
* 1)x.clone() != x 應該返回 true
* 2)x.clone().getClass() == x.getClass() 應該返回 true
* 3)x.clone().equals(x) 應該返回 true
*/
@Override
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回此對象的字符串表示。
* 默認值 getClass().getName() + '@' + Integer.toHexString(hashCode())
*/
@Override
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 隨機喚醒一個在此對象監視器上阻塞等待的線程。
* 1)只有當目標線程放棄此對象的監視器時,被喚醒的線程才能正常執行。
* 2)此方法調用以前,目標線程必須先得到此對象的監視器,
* 調用此對象的同步方法
* 經過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
* 若是是 Class 類型,則能夠調用此類型的靜態同步方法
* 3)任什麼時候刻,只能有一個線程擁有此對象的監視器
*/
@Override
@HotSpotIntrinsicCandidate
public final native void notify();
/**
* 喚醒全部在此對象的監視器上阻塞等待的線程
* 1)只有當目標線程放棄此對象的監視器時,被喚醒的線程才能正常執行。
* 2)此方法調用以前,目標線程必須先得到此對象的監視器,
* 調用此對象的同步方法
* 經過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
* 若是是 Class 類型,則能夠調用此類型的靜態同步方法
* 3)任什麼時候刻,只能有一個線程擁有此對象的監視器
*/
@Override
@HotSpotIntrinsicCandidate
public final native void notifyAll();
/**
* 讓當前線程在此對象的監視器上阻塞等待,直到被喚醒或被中斷。
* 1)此方法調用以前,目標線程必須先得到此對象的監視器,
* 調用此對象的同步方法
* 經過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
* 若是是 Class 類型,則能夠調用此類型的靜態同步方法
*/
@Override
public final void wait() throws InterruptedException {
wait(0L);
}
/**
* 讓當前線程在此對象的監視器上阻塞等待,直到被喚醒、被中斷、阻塞等待超時。
* 1)此方法調用以前,目標線程必須先得到此對象的監視器,
* 調用此對象的同步方法
* 經過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
* 若是是 Class 類型,則能夠調用此類型的靜態同步方法
*
* @param timeout 阻塞等待的毫秒數
*/
@Override
public final native void wait(long timeout) throws InterruptedException;
/**
* 讓當前線程在此對象的監視器上阻塞等待,直到被喚醒、被中斷、阻塞等待超時。
* 1)此方法調用以前,目標線程必須先得到此對象的監視器,
* 調用此對象的同步方法
* 經過 synchronized(obj){} 同步代碼塊獲取此對象的監視器
* 若是是 Class 類型,則能夠調用此類型的靜態同步方法
*
* @param timeout 阻塞等待的毫秒數
* @param nanos 納秒增量
*/
@Override
public final void wait(long timeout, int nanos) throws InterruptedException {
// 1)超時時間爲負數
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);
}
/**
* 垃圾回收器將調用此方法執行此對象的垃圾回收,
* 1)調用時機不肯定
* 2)只能調用一次
* 3)不建議覆蓋此方法執行資源釋放
* 4)若是此方法拋出異常,則該異常將被忽略,若是在此方法中執行資源釋放,則可能致使資源泄漏
* <p>
*/
@Override
@Deprecated(since="9")
protected void finalize() throws Throwable { }
}