object類常見方法
/*** native 方法,用于返回當前運行時對象的 Class 對象,使用了 final 關鍵字修飾,故不允許子類重寫。*/
public final native Class<?> getClass()
/*** native 方法,用于返回對象的哈希碼,主要使用在哈希表中,比如 JDK 中的HashMap。*/
public native int hashCode()
/*** 用于比較 2 個對象的內存地址是否相等,String 類對該方法進行了重寫以用于比較字符串的值是否相等。*/
public boolean equals(Object obj)
/*** native 方法,用于創建并返回當前對象的一份拷貝。*/
protected native Object clone() throws CloneNotSupportedException
/*** 返回類的名字實例的哈希碼的 16 進制的字符串。建議 Object 所有的子類都重寫這個方法。*/
public String toString()
/*** native 方法,并且不能重寫。喚醒一個在此對象監視器上等待的線程(監視器相當于就是鎖的概念)。如果有多個線程在等待只會任意喚醒一個。*/
public final native void notify()
/*** native 方法,并且不能重寫。跟 notify 一樣,唯一的區別就是會喚醒在此對象監視器上等待的所有線程,而不是一個線程。*/
public final native void notifyAll()
/*** native方法,并且不能重寫。暫停線程的執行。注意:sleep 方法沒有釋放鎖,而 wait 方法釋放了鎖 ,timeout 是等待時間。*/
public final native void wait(long timeout) throws InterruptedException
/*** 多了 nanos 參數,這個參數表示額外時間(以納秒為單位,范圍是 0-999999)。 所以超時的時間還需要加上 nanos 納秒。。*/
public final void wait(long timeout, int nanos) throws InterruptedException
/*** 跟之前的2個wait方法一樣,只不過該方法一直等待,沒有超時時間這個概念*/
public final void wait() throws InterruptedException
/*** 實例被垃圾回收器回收的時候觸發的操作*/
protected void finalize() throws Throwable { }
解讀:
- 被final修飾的類表示不可改變,因為所有的類都屬于object類的子類,所以所有類都不能重寫被final修飾的方法。
- 在Java中,
native
是一個方法修飾符關鍵字,用于表示該方法的實現不是用Java編寫的,而是用其他語言(如C或C++)編寫的本地代碼。這些方法通過Java本地接口(JNI)與Java虛擬機交互
Java中的值傳遞
基本數據類型傳遞:修改方法內的基本類型參數不會影響原始值。
引用數據類型傳遞:修改方法內的引用類型參數(例如數組或對象)會影響原始對象,因為副本和原始引用指向同一個對象。但是,如果嘗試改變引用本身(即讓副本引用另一個對象),則不會影響原始引用。對于引用類型,傳遞的是引用的副本(內存地址的副本)簡單說:拷貝了鑰匙,但開的還是同一把鎖。?但正是因為傳遞的是內存地址的副本,再次對引用對象賦值時卻不會改變引用本身。
==與equals()方法
- 對于基本數據類型來說,
==
?比較的是值。 - 對于引用數據類型來說,
==
?比較的是對象的內存地址。
因為 Java 只有值傳遞,所以,對于 == 來說,不管是比較基本數據類型,還是引用數據類型的變量,其本質比較的都是值,只是引用類型變量存的值是對象的地址。
object類的equals方法
public boolean equals(Object obj) {return (this == obj);
}
- 沒有重寫equals方法時,equals方法就是==
重寫后的equals方法
String
中的 equals
方法是被重寫過的,因為 Object
的 equals
方法是比較的對象的內存地址,而 String
的 equals
方法比較的是對象的值。
當創建 String
類型的對象時,虛擬機會在常量池中查找有沒有已經存在的值和要創建的值相同的對象,如果有就把它賦給當前引用。如果沒有就在常量池中重新創建一個 String
對象。
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;
}
解讀:
先比較地址:
if (this == anObject)
?→ 如果是同一個對象,直接返回true (這一步是優化)檢查類型:
if (anObject instanceof String)
?→ 如果不是String類型,直接返回false比較長度:
if (n == anotherString.value.length)
?→ 長度不同直接返回false逐字符比較:
while
循環逐個比較字符,有任何不同就返回false全部相同:所有字符都相同,返回true
小結:
本篇博客主要介紹了object類和它的重要方法,同時介紹了Java中的值傳遞,進而引出equals方法,在后面解讀源碼時,我們還會講一講它和hashcode()的難解難分。希望能帶給你啟發!