Java基礎-----基類Object源碼分析

    在Java中,全部的類都默認繼承同一個類,那就是Object類;Object類是惟一沒有父類的類;位於java.lang 包下;html

一、定義

二、構造器

默認有系統生成無參構造器  public Object(){};
java

三、屬性

Object類沒有聲明任何成員變量和類變量程序員

四、方法摘要
       protected native   Object clone()       

 建立並返回此對象的一個副本。  採用本地系統語言編寫編程

這個方法比較特殊,子類必須實現Cloneable 接口 ,不然會拋出異常 java.lang.CloneNotSupportedException;api

只能子類進行調用clone,Object類實例沒法調用,由於Object沒有實現Cloneable 接口 ;該方法只是進行淺拷貝,編程語言

被複制對象的全部變量都含有與原來的對象相同的值,而全部的對其餘對象的引用仍然指向原來的對象ide

public class ObjectTest implements Cloneable {
	public static void main(String[] args) throws Exception {
		ObjectTest objTest = new ObjectTest();
		Object obj = objTest.clone();
		System.out.println(objTest == obj);
	}
}
false
public  boolean equals(Object obj)      

    兩個引用是否指向同一個對象。若是子類不重寫該方法,默認比較對象引用是否相同;性能

equals 方法在非空對象引用上實現相等關係:spa

  • 自反性:對於任何非空引用值 xx.equals(x) 都應返回 true.net

  • 對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true

  • 傳遞性:對於任何非空引用值 xy 和 z,若是 x.equals(y) 返回 true,而且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true

  • 一致性:對於任何非空引用值 x 和 y,屢次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。

  • 對於任何非空引用值 xx.equals(null) 都應返回 false

Object 類的 equals 方法實現對象上差異可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 truex == y 具備值 true)。

注意:當此方法被重寫時,一般有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具備相等的哈希碼。

protected  void finalize()        

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

public class ObjectTest implements Cloneable {
	
	@Override
	protected void finalize() throws Throwable {
		System.out.println("回收了");
		super.finalize();
	}

	public static void main(String[] args) throws Exception {
		ObjectTest objTest = new ObjectTest();
                for (int i = 0; i < 100; i++) {
			objTest = new ObjectTest();
		}
		ObjectTest obj = (ObjectTest)objTest.clone();
		System.out.println(obj);
	}

}

 在代碼中打個Debug斷點,而後Debug 運行;

在JDK安裝目錄打開jvisualvm.exe

選擇正在運行的類,在右半部分找到 監視 頁,找到  執行垃圾回收按紐 進行點擊  查看控制檯

 public final native   Class<?>  getClass()         

  返回此 Object 的運行時類。表示Object其實是哪一個類

public class ObjectTest  {
	
	public static void main(String[] args) throws Exception {
		Object objTest = new ObjectTest();
		System.out.println(objTest.getClass().getName());
	}

}
cn.trip.core.servlet.ObjectTest
 public native   int hashCode()   

     返回該對象的哈希碼值。本地方法;

當你覆寫(override)了equals()方法以後,必須也覆寫hashCode()方法,反之亦然。這個方法返回一個整型值(hash code value),若是兩個對象被equals()方法判斷爲相等,那麼它們就應該擁有一樣的hash code

hashCode 的常規協定是:

  • 在 Java 應用程序執行期間,在對同一對象屢次調用 hashCode 方法時,必須一致地返回相同的整數,前提是將對象進行 equals 比較時所用的信息沒有被修改。從某一應用程序的一次執行到同一應用程序的另外一次執行,該整數無需保持一致。

  • 若是根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每一個對象調用 hashCode 方法都必須生成相同的整數結果。

  • 若是根據 equals(java.lang.Object) 方法,兩個對象不相等,那麼對這兩個對象中的任一對象上調用 hashCode 方法 要求必定生成不一樣的整數結果。可是,程序員應該意識到,爲不相等的對象生成不一樣整數結果能夠提升哈希表的性能。

實際上,由 Object 類定義的 hashCode 方法確實會針對不一樣的對象返回不一樣的整數。(這通常是經過將該對象的內部地址轉換成一個整數來實現的,可是 JavaTM 編程語言不須要這種實現技巧。)

public final   native  void notify()       

 喚醒在此對象監視器上等待的單個線程。若是全部線程都在此對象上等待,則會選擇喚醒其中一個線程。選擇是任意性的,並在對實現作出決定時發生;

  public final native  void notifyAll()         

 喚醒在此對象監視器上等待的全部線程。

public final  void wait()        

 在其餘線程調用此對象的 notify() 方法或 notifyAll() 方法前,致使當前線程等待。

 public final native  void wait(long timeout)        

  在其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,致使當前線程等待。

 public final  void wait(long timeout, int nanos)         

  在其餘線程調用此對象的 notify() 方法或 notifyAll() 方法,或者其餘某個線程中斷當前線程,或者已超過某個實際時間量前,致使當前線程等待。

 public   String toString()     

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

相關文章
相關標籤/搜索