面向對象回顧(靜態變量、類加載機制/雙親委派模型、Object類的方法、類和對象區別)

1. 靜態變量存在什麼位置?

方法區

2. 類加載機制,雙親委派模型,好處是什麼?

某個特定的類加載器在接到加載類的請求時,首先將加載任務委託給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。

使用雙親委派模型的好處在於Java類隨着它的類加載器一起具備了一種帶有優先級的層次關係

  • 例如類java.lang.Object,它存在在rt.jar中,
  • 無論哪一個類加載器要加載這個類,最終都是委派給處於模型最頂端的Bootstrap ClassLoader進行加載,
  • 因此Object類在程序的各種類加載器環境中都是同一個類。
  • 相反,如果沒有雙親委派模型而是由各個類加載器自行加載的話,如果用戶編寫了一個java.lang.Object的同名類並放在ClassPath中,那系統中將會出現多個不同的Object類,程序將混亂。
  • 因此,如果開發者嘗試編寫一個與rt.jar類庫中重名的Java類,可以正常編譯,但是永遠無法被加載運行。

3. Object類的方法並簡要說明

Object()默認構造方法。

clone() 創建並返回此對象的一個副本。

equals(Object obj) 指示某個其他對象是否與此對象“相等”。

finalize()當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。

getClass()返回一個對象的運行時類。

hashCode()返回該對象的哈希碼值。

notify()喚醒在此對象監視器上等待的單個線程。

notifyAll()喚醒在此對象監視器上等待的所有線程。

toString()返回該對象的字符串表示。

wait()導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。

wait(long timeout)導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量。

wait(long timeout, int nanos) 導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其他某個線程中斷當前線程,或者已超過某個實際時間量。

3.1 wait方法的底層原理

ObjectSynchronizer::wait方法通過object的對象中找到ObjectMonitor對象調用方法 void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS)

通過ObjectMonitor::AddWaiter調用把新建立的ObjectWaiter對象放入到 _WaitSet 的隊列的末尾中然後在ObjectMonitor::exit釋放鎖,接着 thread_ParkEvent->park 也就是wait。

4. 類和對象的區別

1.類是對某一類事物的描述,是抽象的;而對象是一個實實在在的個體,是類的一個實例。

比如:“人”是一個類,而“教師”則是“人”的一個實例。

2.對象是函數、變量的集合體;而類是一組函數和變量的集合體,即類是一組具有相同屬性的對象集合體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章