Object要點記錄

賴在床上的小發表於2020-09-23

Object是所有有層級的類的根,這裡要說明一下基本資料型別和Object是沒有關係的(基本資料型別包括:byte 、int、short、long、double、float、boolean、char)
類的結構如下
在這裡插入圖片描述
因為java是在作業系統上進行,其本質是對作業系統的操做,其底層的實現程式碼主要還是C/C++,所以其原始碼中呼叫的大量的本地函式,接下來對各個函式進行重點解析。

  1. registerNatives
 private static native void registerNatives();

為了讓JVM找到您的本機函式,必須以某種方式命名它們。例如,對於

java.lang.Object.registerNatives

,相應的C函式命名為

Java_java_lang_Object_registerNatives

在Object 類中使用靜態程式碼塊,在類載入的初始化時呼叫registerNatives方法完成對本地方法的註冊。
注:靜態程式碼塊呼叫可以參考
類載入時機可以參考

static {
    registerNatives();
}

2.hashCode
物件的判斷==是判斷物件記憶體地址是否相等
Object 中equals方法也是如此, String中重寫了equals方法所以實現了字串的值判斷。
hashcode的好處是在hashmap中可以實現對儲存物件的快速查詢。
3. clone
返回物件的副本

表示式結果
x.clone() != xtrue
x.clone().getClass() == x.getClass()true
x.clone().equals(x)true

延伸一下:建立物件的方式

  • 常見的new
  • 通過反射 例子:Class.forName(XXX.class).newInstance();
  • clone
  • 反序列化

4.wait、notify、notifyAll
wait:會引起當前執行緒阻塞
notify:隨機喚醒當前類監視器下的一個單執行緒
notifyAll :喚醒當前監視器下的所有等待執行緒
wait、notify和notifyAll
只能由作為該物件的監視器的所有者的執行緒呼叫。執行緒可以通過以下三種方式之一成為物件監視器的所有者:

  • 通過執行該物件的同步例項方法即由synchronize。
  • 通過執行在物件上同步的 Synchronized語句的主體。
  • 對於型別為class的物件,請執行該類的同步靜態方法。

wait狀態的執行緒喚醒的四種情況:

  • notify隨機喚醒
  • notifyAll全部喚醒
  • Interrupt
  • 設定的等待時間已滿足

被喚醒的執行緒平等的競爭該物件的鎖。
sleep和wait雖然執行緒同樣是阻塞其最大的區別在於wait會釋放物件鎖而sleep不會釋放。

5.finalize
在物件gc回收前呼叫執行。詳細參考

相關文章