政府網(wǎng)站用什么cmsseo新人怎么發(fā)外鏈
Object
概述
Object類是所有類的基類——java.lang.Object。
- Object類是所有類的基類,當一個類沒有直接繼承某個類時,默認繼承Object類
- Object類屬于java.lang包下,此包下的所有類在使用時無需手動導(dǎo)入,系統(tǒng)會在程序編譯期間自動導(dǎo)入。
Object類有七個native方法:registerNatives()、getClass()、hashCode()、clone()、notify()、notifyAll()。
源碼解析
/*** native 方法,用于返回當前運行時對象的Class對象,使用了final關(guān)鍵字修飾,故不允許子類重寫。*/
public final native Class<?> getClass()
/*** native 方法,用于返回對象的哈希碼,主要使用在哈希表中,比如JDK中的HashMap.
*/
public native int hashCode()
/**
* 用于比較兩個對象的內(nèi)存地址是否相等。
*/
public boolean equals(Object obj)
/**
* naitive 方法,用于創(chuàng)建并返回當前對象的一份拷貝。
*/
protected native Object clone() throws CloneNotSupportedException
/**
* 返回類的名字實例的哈希碼的16進制的字符串。
*/
public String toString()
/**
* native方法,并且不能重寫。喚醒一個在此對象監(jiān)視器上等待的線程(監(jiān)視器相當于就是鎖的概念)。如果有多個線程在等待只會任意喚醒一個。
*/
public final native void notify()
/*** native 方法,并且不能重寫。跟 notify 一樣,唯一的區(qū)別就是會喚醒在此對象監(jiān)視器上等待的所有線程,而不是一個線程。*/
public final native void notifyAll()
/**
* native方法,并且不能重寫。暫停線程的執(zhí)行。注意:sleep方法沒有釋放鎖,而wait方法釋放了鎖,timeout是等待時間。
*/
public final native void wait(long timeout) throws InterruptedException
/*** 多了 nanos 參數(shù),這個參數(shù)表示額外時間(以毫微秒為單位,范圍是 0-999999)。 所以超時的時間還需要加上 nanos 毫秒。*/
public final void wait(long timeout, int nanos) throws InterruptedException
/*** 跟之前的2個wait方法一樣,只不過該方法一直等待,沒有超時時間這個概念*/
public final void wait() throws InterruptedException
/*** 實例被垃圾回收器回收的時候觸發(fā)的操作*/
protected void finalize() throws Throwable
類構(gòu)造器?
?一個類必須要有一個構(gòu)造器的存在,如果沒有顯示聲明,那么系統(tǒng)會默認創(chuàng)建一個無參構(gòu)造器,在JDK的Object類源碼中,是看不到構(gòu)造器的,系統(tǒng)會自動添加一個無參構(gòu)造器。
// 構(gòu)造一個Object類的對象。
Object obj = new Object();
equals方法
?源碼
public boolean equals(Object obj) {return (this == obj);}
結(jié)論:
- 在 Object 類中,== 運算符和 equals 方法是等價的,都是比較兩個對象的引用是否相等,從另一方面來講,如果兩個對象的引用相等,那么這兩個對象一定是相等的
- 對于我們自定義的一個對象,如果不重寫 equals 方法,那么在比較對象的時候就是調(diào)用 Object 類的 equals 方法,也就是用 == 運算符比較兩個對象
?重寫equals原則
@Overridepublic boolean equals(Object otherObject) {//1、判斷比較的兩個對象引用是否相等,如果引用相等那么表示是同一個對象,那么當然相等if(this == otherObject){return true;}//2、如果 otherObject 為 null,直接返回false,表示不相等if(otherObject == null ){//對象為空或者不是Person類的實例return false;}//3、比較 this 和 otherObject 是否是同一個類(注意下面兩個只能使用一種)//3.1:如果 equals 的語義在每個子類中所有改變,就使用 getClass 檢測if(this.getClass() != otherObject.getClass()){return false;}//3.2:如果所有的子類都有統(tǒng)一的定義,那么使用 instanceof 檢測if(!(otherObject instanceof Person)){return false;}//4、將 otherObject 轉(zhuǎn)換成對應(yīng)的類類型變量Person other = (Person) otherObject;//5、最后對對象的屬性進行比較。使用 == 比較基本類型,使用 equals 比較對象。如果都相等則返回true,否則返回false// 使用 Objects 工具類的 equals 方法防止比較的兩個對象有一個為 null而報錯,因為 null.equals() 是會拋異常的return Objects.equals(this.pname,other.pname) && this.page == other.page;//6、注意如果是在子類中定義equals,則要包含 super.equals(other)//return super.equals(other) && Objects.equals(this.pname,other.pname) && this.page == other.page;}
如果在重寫?equals()
?方法時沒有重寫?hashCode()
?方法,使用?HashMap
?可能會出現(xiàn)以下問題:
-
違反?
Java 規(guī)定,如果兩個對象通過?hashCode
?契約:equals()
?方法比較相等,那么它們的?hashCode()
?也必須相等。如果只重寫?equals()
?而不重寫?hashCode()
,可能會導(dǎo)致兩個相等的對象返回不同的哈希值,從而違反這一契約。 -
HashMap 無法正確查找對象:
HashMap
?依賴?hashCode()
?來確定對象的存儲位置。如果兩個對象相等但?hashCode()
?不同,HashMap
?可能會將它們放在不同的桶中,導(dǎo)致無法通過?get()
?方法正確找到對象。 -
數(shù)據(jù)丟失或重復(fù):
由于?HashMap
?使用?hashCode()
?和?equals()
?來管理鍵值對,如果?hashCode()
?不一致,可能會導(dǎo)致數(shù)據(jù)被錯誤地存儲或覆蓋,進而引發(fā)數(shù)據(jù)丟失或重復(fù)。
getClass方法
public final native Class<?> getClass();
getClass()在 Object 類中如上,作用是返回對象的運行時類。
toString 方法
public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
- getClass().getName()是返回對象的全類名(包含包名),Integer.toHexString(hashCode()) 是以16進制無符號整數(shù)形式返回此哈希碼的字符串表示形式。
- 打印某個對象時,默認是調(diào)用 toString 方法,比如 System.out.println(person),等價于 System.out.println(person.toString())。
clone方法
/**
* 本地clone方法,用于對象的復(fù)制
*/
protected native Object clone() throws CloneNotSupportedException;
保護方法,實現(xiàn)對象的淺拷貝,只有實現(xiàn)了Cloneable接口才可以調(diào)用該方法,否則拋出CloneNotSupportedException異常。
finalize 方法
protected void finalize() throws Throwable { }
當 GC 確定不再有對該對象的引用時,GC 會調(diào)用對象的?finalize()
?方法來清除回收。
JVM 會確保一個對象的?finalize()
?方法只被調(diào)用一次,而且程序中不能直接調(diào)用?finalize()
?方法。
finalize()
?方法通常也不可預(yù)測,而且很危險,一般情況下,不必要覆蓋?finalize()
?方法。
?
?
?
?