(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();
喚醒
喚醒所有