1. 程式人生 > >基礎類學習1-Obejct

基礎類學習1-Obejct

一、介紹

Object類是存在於java.lang包下面。Object類其他所有類的基類。

二、結構

上述共包含12個方法,其中有Java實現的原生方法和其他語言實現的Native方法

1、registerNatives()方法

相關概念點:native、static塊

private static native void registerNatives();

static { registerNatives(); }

Java中,用native關鍵字修飾的函式表明該方法的實現並不是在Java中去完成,而是由C/C++去完成,並被編譯成了.dll,由Java去呼叫。方法的具體實現體在dll檔案中,對於不同平臺,其具體實現有所不同。用native修飾,即表示作業系統,需要提供此方法,Java本身需要使用。具體到registerNatives()方法本身,其主要作用是將C/C++中的方法對映到Java中的native方法,實現方法命名的解耦。

2、getClass() 方法

相關概念點:final、反射

public final native Class<?> getClass();

返回此Object的執行時類。 返回的物件是被表示類的static synchronized方法鎖定的物件。

實際結果的型別是Class<? extends |X|>其中|X|是靜態型別上其表達的擦除getClass被呼叫。

3、hashcode方法

相關概念點:雜湊存在的意義、雜湊碰撞及其解決方法

public native int hashCode();

返回物件的雜湊碼值

4、equals()方法

相關概念點:equals與==的區別

public boolean equals(Object obj) {
    return (this == obj);
}

equals方法在非空物件引用上實現等價關係: 

    自反性 :對於任何非空的參考值x , x.equals(x)應該返回true 。 
    對稱性 :對於任何非空引用值x和y , x.equals(y)應該返回true當且僅當y.equals(x)返回true 。 
    傳遞性 :對於任何非空引用值x , y和z ,如果x.equals(y)返回true且y.equals(z)返回true ,然後x.equals(z)應該返回true 。 
    一致性 :對於任何非空引用值x和y ,多次呼叫x.equals(y)始終返回true或始終返回false ,沒有設定中使用的資訊equals比較上 的物件被修改。 
對於任何非空的參考值x , x.equals(null)應該返回false 。 
該equals類方法Object實現物件上差別可能性最大的相等關係; 也就是說,對於任何非空的參考值x和y ,當且僅當x和y引用相同的物件( x == y具有值true )時,該方法返回true 。 

5、clone方法

protected native Object clone() throws CloneNotSupportedException;

建立並返回此物件的副本

CloneNotSupportedException - 如果物件的類不支援Cloneable介面。 覆蓋clone方法的子類也可以丟擲此異常以指示例項無法克隆。

6、toString()方法

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

返回物件的字串表示形式。

該toString類方法Object返回一個由其中的物件是一個例項,該符號字元`的類的名稱的字串@ ”和物件的雜湊碼的無符號的十六進位制表示。 換句話說,這個方法返回一個等於下列值的字串: 

 getClass().getName() + '@' + Integer.toHexString(hashCode())

7、notify()方法

public final native void notify();

喚醒正在等待物件監視器的單個執行緒。 如果任何執行緒正在等待這個物件,其中任意一個被選擇被喚醒。

該方法只能由作為該物件的監視器的所有者的執行緒呼叫。 執行緒以三種方式之一成為物件監視器的所有者: 

    通過執行該物件的同步例項方法。 
    通過執行在物件上synchronized synchronized語句的正文。 
    對於型別為Class,的物件,通過執行該類的同步靜態方法。 
一次只能有一個執行緒可以擁有一個物件的顯示器。 

8、notifyAll()方法

public final native void notifyAll();

喚醒正在等待物件監視器的所有執行緒。

9、wait()方法

public final native void wait(long timeout) throws InterruptedException;

timeout - 以毫秒為單位等待的最長時間

        此方法使當前執行緒(稱為T )將其放置在該物件的等待集中,然後放棄對該物件的任何和所有同步宣告。 執行緒T變得禁用執行緒排程目的,並且休眠,直到發生四件事情之一: 

        一些其他執行緒呼叫該物件的notify方法,並且執行緒T恰好被任意選擇為被喚醒的執行緒。 
        某些其他執行緒呼叫此物件的notifyAll方法。 
       一些其他執行緒interrupts執行緒T。 
        指定的實時數量已經過去,或多或少。 然而,如果timeout為零,則不考慮實時,執行緒等待直到通知。 
然後從該物件的等待集中刪除執行緒T ,並重新啟用執行緒排程。 然後它以通常的方式與其他執行緒競爭在物件上進行同步的許可權; 一旦獲得了物件的控制,其對物件的所有同步宣告就恢復到現狀 - 也就是在呼叫wait方法之後的情況。 執行緒T然後從呼叫wait方法返回。 因此,從返回wait方法,物件和執行緒的同步狀態T正是因為它是當wait被呼叫的方法。 
執行緒也可以喚醒,而不會被通知,中斷或超時,即所謂的虛假喚醒 。 雖然這在實踐中很少會發生,但應用程式必須通過測試應該使執行緒被喚醒的條件來防範,並且如果條件不滿足則繼續等待。
 

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 >= 500000 || (nanos != 0 && timeout == 0)) {
        timeout++;
    }

    wait(timeout);
}

timeout - 以毫秒為單位等待的最長時間。 
nanos - 額外的時間,以納秒範圍0-999999。

public final void wait() throws InterruptedException {
    wait(0);
}

10、finalize()方法

protected void finalize() throws Throwable { }

當垃圾收集確定不再有對該物件的引用時,垃圾收集器在物件上呼叫該方法。 一個子類覆蓋了處理系統資源或執行其他清理的finalize方法

finalize方法從不被任何給定物件的Java虛擬機器呼叫多次。 

finalize方法丟擲的任何異常都會導致該物件的終止被停止,否則被忽略。