1. 程式人生 > 實用技巧 >(2)java.lang.Object

(2)java.lang.Object

java.lang.Object

所有類都直接或間接繼承該類

1、類結構

public class Object

2、native

native方法:指非Java語言寫的方法,一般是系統提供的,對底層進行直接操作。由關鍵字native宣告,jvm進行呼叫。

(除非是開始系統深入學習虛擬機器,否則很難,也沒有必要學習native的實現)

private static native void registerNatives();
static {
    registerNatives();
}

registerNatives方法具體做什麼暫時不用研究,按名字大概是對本類中的native方法進行註冊

該方法出現的類一定有其它native方法,比如java.lang.System。

而包含native方法的類也可能沒有該方法,比如java.lang.String。

3、構造方法

只有預設的構造方法

4、 其它方法

(1)克隆

protected native Object clone() throws CloneNotSupportedException;

物件克隆,需要實現java.lang.Cloneable介面,然後重寫Object的clone方法。

參考

淺拷貝:只是建立新的物件,物件屬性是原物件的屬性

深拷貝:不僅建立新的物件,同時對原屬性也進行建立。

第三種方案:不實現java.lang.Cloneable,而是實現java.io.Serializable介面完成深拷貝

(2)等於

==:

  • 不能判斷基本資料型別和一個引用資料型別
  • 判斷兩個引用資料型別是判斷地址
  • 判斷兩個基本資料型別是判斷值
  • 同時boolean型別不能和其它基本型別比較
public boolean equals(Object obj) {
    return (this == obj);
}
  • 只有非null的引用資料型別物件才能呼叫equas方法
  • this指代本類的當前物件

比較的幾個準則:

  • 自反性:a.equals(b)為true,反之b.equals(a)也為true,false是一樣的,obj為null除外。
  • 傳遞性:a.equals(b)為true,b.equals(c)為true,則a.equals(c)也為true
  • 永續性:只要本身沒有發生改變,a.equals(b)的結果應該一直不變
  • a.equals(b),b為null則結果為false

在子類重寫equals方法時也應該遵守這幾條規則。

(3)finalize完成

protected void finalize() throws Throwable { }

是手動進行資源回收的,慎用。

在Java11被廢棄

(4)hash碼

public native int hashCode();

雜湊演算法:指一種演算法模型,具體由其它演算法實現,比如md4,md5。

該演算法是單向的,即只能加密而無法解密。

雜湊演算法是將一個不定長度的資料對映成一個固定長度的資料,結果即為雜湊碼。根據雜湊碼無法求得原值。

相同物件的雜湊碼一定相同,不同物件的雜湊碼也可能相同。

實際上,雜湊碼不是完全無法取得原值,有人將常用文字對映成雜湊碼做成一張表,通過查詢雜湊碼,能夠得到一組原值。但是無法準確求得,也保證原值一定在這組資料之中。

Java的Object物件的雜湊碼是通過地址相關來求得的。

(5)獲取Class物件

public final native Class<?> getClass();

Class類物件是在類載入的時候由虛擬機器建立的,唯一。

Student student = new Student();
student.setName("張三");
Student student1 = new Student();
System.out.println(student1.getClass() == student.getClass());

結果為true

(6)toString

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

輸出物件的Class類名和雜湊碼的十六進位制字串。

(7)wait

public final void wait() throws InterruptedException {
    wait(0);
}
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);
}

wait:讓當前執行緒進入等待狀態(掛起),同時釋放當前執行緒持有的鎖。直到其它執行緒呼叫此物件的notify或notifyAll方法,該執行緒被喚醒進入就緒狀態。

wait():立即掛起

wait(long timeout):單位毫秒

wait(long timeout, int nanos):毫秒,納秒

(8)notify、notifyAll

public final native void notify();
public final native void notifyAll();

喚醒

喚醒所有