java中Object類是什么?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!
十年的利川網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整利川建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“利川網(wǎng)站設(shè)計”,“利川網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
Object類有哪些方法
registerNatives()【底層實現(xiàn)、不研究】hashCode()equals(Object obj)clone()toString()notify()notifyAll()wait(long timeout)【還有重載了兩個】finalize()Object一共有11個方法,其中一個為底層的實現(xiàn)registerNatives(),其中兩個wait()和wait(long timeout, int nanos)重載方法。還有一個屬性:返回字節(jié)碼文件對象
hashCode
public native int hashCode();
由native方法底層實現(xiàn)了
equals
public boolean equals(Object obj) { return (this == obj); }
直接判斷內(nèi)存地址了
想要更加清晰它們究竟是做什么的,我們來讀讀它的注釋:
根據(jù)注釋我們可以總結(jié)以下的要點:
- 重寫
equals()
方法,就必須重寫hashCode()
的方法equals()
方法默認(rèn)是比較對象的地址,使用的是==
等值運算符hashCode()
方法對底層是散列表的對象有提升性能的功能- 同一個對象(如果該對象沒有被修改):那么重復(fù)調(diào)用
hashCode()
那么返回的int是相同的!hashCode()
方法默認(rèn)是由對象的地址轉(zhuǎn)換而來的equals()
方法還有5個默認(rèn)的原則:
- 自反性--->調(diào)用
equals()
返回的是true,無論這兩個對象誰調(diào)用equals()
都好,返回的都是true- 一致性--->只要對象沒有被修改,那么多次調(diào)用還是返回對應(yīng)的結(jié)果!
- 傳遞性--->
x.equals(y)
和y.equals(z)
都返回true,那么可以得出:x.equals(z)
返回true- 對稱性--->
x.equals(y)
和y.equals(x)
結(jié)果應(yīng)該是相等的。- 傳入的參數(shù)為null,返回的是false
為啥說hashCode()以散列表為底層帶來性能的提升是很容易理解的。我們再來回顧一下HashMap的插入:
如果hash值都不相等,那么可以直接判斷該key是不相等的了!
toString
toString方法主要是用來標(biāo)識該對象的
- clone方法用于對象的克隆,一般想要克隆出的對象是獨立的(與原有的對象是分開的)
- 深拷貝指的是該對象的成員變量(如果是可變引用)都應(yīng)該克隆一份,淺拷貝指的是成員變量沒有被克隆一份
如何克隆對象?
- 克隆的對象要實現(xiàn)Cloneable接口
- 重寫clone方法,最好修飾成public
wait和notify方法其實就是Java給我們提供讓線程之間通信的API。
- 無論是wait、notify還是notifyAll()都需要由監(jiān)聽器對象(鎖對象)來進行調(diào)用
- 簡單來說:他們都是在同步代碼塊中調(diào)用的,否則會拋出異常!
notify()
喚醒的是在等待隊列的某個線程(不確定會喚醒哪個),notifyAll()
喚醒的是等待隊列所有線程- 導(dǎo)致
wait()
的線程被喚醒可以有4種情況
- 該線程被中斷
wait()
時間到了- 被
notify()
喚醒- 被
notifyAll()
喚醒- 調(diào)用
wait()
的線程會釋放掉鎖
為什么wait和notify在Object方法上
- 因為我們的鎖是對象鎖【要是忘記的同學(xué)可回顧:Java鎖機制了解一下】,每個對象都可以成為鎖。讓當(dāng)前線程等待某個對象的鎖,當(dāng)然應(yīng)該通過這個對象來操作了
- 鎖對象是任意的,所以這些方法必須定義在Object類中
Thread.sleep()與
Object.wait()
二者都可以暫停當(dāng)前線程,釋放CPU控制權(quán)。
- 主要的區(qū)別在于
Object.wait()
在釋放CPU同時,釋放了對象鎖的控制。- 而
Thread.sleep()
沒有對鎖釋放
但是要注意的是:
notify方法調(diào)用后,被喚醒的線程不會立馬獲得到鎖對象。而是等待notify的synchronized代碼塊執(zhí)行完之后才會獲得鎖對象
finalize()`方法將在垃圾回收器清除對象之前調(diào)用,但該方法不知道何時調(diào)用,具有不定性
一般我們都不會重寫它~
一個對象的finalize()方法只會被調(diào)用一次,而且finalize()被調(diào)用不意味著gc會立即回收該對象,所以有可能調(diào)用finalize()后,該對象又不需要被回收了,然后到了真正要被回收的時候,因為前面調(diào)用過一次,所以不會調(diào)用finalize(),產(chǎn)生問題。
感謝各位的閱讀!看完上述內(nèi)容,你們對java中Object類是什么大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。