Java進階技術第三章—— Java的"萬類之祖"Object類詳解,萬類object

來源:互聯網
上載者:User

Java進階技術第三章—— Java的"萬類之祖"Object類詳解,萬類object
前言

前言點擊此處查看:
http://blog.csdn.net/wang7807564/article/details/79113195

Object類

Java是單根繼承的,故而Obeject類是所有類的父類。其JDK1.8中定義的原始碼為:

public class Object {    private static native void registerNatives();    static {        registerNatives();    }    public final native Class<?> getClass();    public native int hashCode();    public boolean equals(Object obj) {        return (this == obj);    }    protected native Object clone() throws CloneNotSupportedException;    public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }    public final native void notify();    public final native void notifyAll();    public final native void wait(long timeout) throws InterruptedException;    public final void wait(long timeout, int nanos) throws InterruptedException {        if (timeout < 0) {            throw new IllegalArgumentException("timeout value is negative");        }        if (nanos < 0 || nanos > 999999) {            throw new IllegalArgumentException("nanosecond timeout value out of range");        }        if (nanos > 0) {            timeout++;        }        wait(timeout);    }    public final void wait() throws InterruptedException {        wait(0);    }    protected void finalize() throws Throwable { }}

有關Object類equals()和hashCode()方法的相關內容,已經在前面涉及到了,其wait()和notify()等內容將在後面的高並發部分中具體詳解。

Object類的clone()方法與深、淺拷貝:
Object類的clone()方法是將現有的一個對象,複製成為一個新的對象。這個新的對象與原來被拷貝的對象是佔據了兩個不同的記憶體空間,二者之間的關係不是參考關聯性了。

但是,Object類的clone()方法預設實現的是淺拷貝複製方式。
所謂的淺拷貝就是指,在對象拷貝的過程中,其8種基礎資料型別 (Elementary Data Type)是按照值進行拷貝的,但是,如果是物件類型的拷貝,預設是按照引用進行拷貝的,即拷貝過去的是一個引用,不是一個具體的記憶體內部儲存的值。
這裡需要額外說明一點,String類型雖然是個類,但是clone()方法對於其的拷貝方式也是按值拷貝,與8種基礎資料型別 (Elementary Data Type)相同,與String類同樣可以自動進行深拷貝類的還有後面所說的基本類型的封裝類。
例如下面這個例子,定義一個名為Test的類:

class Test implements Cloneable{    Test_val test_val = null;    Test(Test_val t){        test_val =  t;    }    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }}

這個類內部定義了一個屬性,這個屬性是Test_val類型的,這是一個類,其定義為:

class Test_val{    int i = 0;    Test_val(int i){        this.i = i;    }}

在main()方法中寫入以下測試代碼:

public class Main {    public static void main(String []argv) throws Exception{        Test test1 = new Test(new Test_val(100));        Test test2 = (Test) test1.clone();        System.out.println(test1.test_val == test2.test_val);        test1.test_val.i = 1;        System.out.println(test1.test_val.i);    }}

其輸出結果是:

true
1

即經過拷貝後的test2對象與test1對象中的test_val變數是同一個記憶體位址,對test1中該屬性值進行修改,test2對象中該屬性的值也會隨之發生改變。
可見,這並沒有被拷貝完全,所以叫做淺拷貝,而對應地,如果被拷貝對象內部屬性的類型是基礎資料型別 (Elementary Data Type),則都是按照值進行拷貝的。也就不會存在這種一個對象被修改,所有對象中的內容跟著改變的現象,所以是深拷貝的。
要想實現對類類型的深拷貝,需要我們自己去根據自己的業務情境重寫clone()方法。在重寫的時候注意,其要實現cloneable介面,否則會報異常,同時,由於Object父類中的clone()方法是proteced修飾的,所以,自訂的方法要想使用clone()方法,需要寫入代碼:

    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }

引用的值是儲存在棧中的,而具體的對象內容是儲存在記憶體的堆中,淺拷貝只是拷貝了儲存在棧中的引用,並沒有拷貝儲存在堆中具體的內容。引用鏈關係越複雜,需要重寫的clone()方法也就越多,而在實際開發的時候,如果想要實現絕對的深拷貝是很困難的。
Java的深拷貝實現了設計模式中的原型模式(Prototype Pattern)。
所謂的原型模式就是用原型執行個體指定建立對象的種類,並通過拷貝這些原型建立新的對象。因此,原型模式主要是用來對象的複製,而實現cloneable介面,重寫clone()方法過程,就是實現原型模式的過程。

Object的finalize()方法:

JVM的記憶體回收行程要回收垃圾對象的時候,首先要調用這個類的finalize()方法,這個過程叫做Java的收尾(finalization)機制。一般純的Java寫的類是不需要額外重寫這個函數的,但是,如果是使用了JNI來調用了C++編寫的代碼,可以重寫這個方法來完成對記憶體垃圾的進一步收尾工作。對於絕大部分Java資源的回收,都是不需要重寫該方法的,同時,由於該方法的調用會消耗較多的系統資源,一般也都不推薦重寫這個方法。
有些時候,我們也重寫finalize()方法來完成特定的功能,例如回收非Java資源。比較常見的是調用了Windows系統資源,如檔案控制代碼,字元字型等等。
在重寫這個方法的時候,應該注意的是,這個方法也是使用protected來修飾的,也就是說,要想重寫該方法,需要使用與上面的clone()方法相同的重寫方式:

    @Overrideprotected void finalize() throws Throwable {    super.finalize();    //define your codes. }

不過在很多情況下,並不推薦自己重寫這個函數,因為在某些情況下,重寫該函數可能非但不會提高效率,反而還會額外增加開銷,所以,在重寫之前,需要權衡一下。

查看評論

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.