JDK8源碼閱讀-Object類

概述

Object是全部類的基類,屬於java.lang包。java

構造方法

只有編譯器提供的默認構造方法。微信

字段

Object類中沒有成員字段。多線程

方法

Object類一共12個方法。this

Object類Structure

按照訪問等級分spa

  • public: getClass()、hashCode()、equals(Object obj)、toString()、notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()
  • protected: clone()、finalize()
  • private: registerNatives()

按照是否爲final分線程

  • final:getClass()、notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()
  • 非final:registerNatives()、hashCode()、equals(Object obj)、clone()、toString()、finalize()

按照是否爲native分3d

  • native:registerNatives()、getClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout)
  • 非native:equals(Object obj)、toString()、wait(long timeout, int nanos)、wait()、finalize()

registerNatives()


private static native void registerNatives();
    static {
        registerNatives();
    }
複製代碼

在初始化調用static代碼塊時調用,用於註冊Object類中的靜態方法。code

getClass()


public final native Class<?> getClass();
複製代碼

返回類對象的Class實例,synchronized靜態代碼塊時鎖定的正是Class實例對象。cdn

hashCode()、equals(Object obj)


public native int hashCode();

public boolean equals(Object obj) {
    return (this == obj);
}
複製代碼

hashCode()返回一個帶符號int,返回一個對象實例的hashCode,其值多是對象的存儲地址;equals方法用來判斷兩個對象是否相等。對象

Java規範中對hashCode、equals方法有以下規範:

  1. hashCode相等,equals不必定爲true
  2. equal方法爲true,hashCode必定相等
  3. hashCode不想等,equals必定不爲true
  4. equals方法爲false,hashCode可能相等

重寫equals(Object obj)方法時必須同時重寫hashCode()方法

clone()


protected native Object clone() throws CloneNotSupportedException;
複製代碼
  • 用於對java對象進行復制,可分爲深複製和淺複製。
  • 若是對象未實現Colneable接口,會拋出CloneNotSupportedException異常

toString()


public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
複製代碼

默認實現爲Class名+"@"+十六進制的hashCode

多線程相關notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()


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 {
    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():喚醒一個正在等待這個對象的monitor線程,若是有多個線程在等待,只能喚醒其中一個
  • notifyAll():喚醒全部在等待這個對象的monitor線程
  • wait(long timeout):將當前持有此對象鎖的線程進入等待狀態,直到線程被notify()、notifyAll()、Thread.interrupts()方法喚醒或者超時。
    • 若是timeout爲0,則會一直等待,直到被另外喚醒
  • wait(long timeout, int nanos):與wait(long timeout)相似,但添加了一個nanos參數以提供更細粒度的等待時間控制
  • wait():默認當前持有對象鎖的線程進入等待狀態並一直等待直到被notify()、notifyAll()、Thread.interrupts()方法喚醒

finalize()


protected void finalize() throws Throwable { }
複製代碼

在GC回收對象實例時會被調用,因GC是不肯定且隨機的,沒法肯定此方法的執行時間(若是內存充足,GC永遠都不會發生則finalize()方法一直都不會被調用)。


歡迎掃碼關注我微信公衆號:magicTan。

相關文章
相關標籤/搜索