2013-09-28 31 views
5

我很好奇Java如何支持拷貝構造函數,它與C++有何不同?我想了解從編譯器端執行三條規則(複製構造函數,析構函數,賦值運算符)的邏輯的Java等價物。Java與C++拷貝構造函數的區別

+3

不,java僅支持對類的引用,而C++支持值和引用,所以java不支持複製ctors,dtors或賦值操作 – Kal

+2

@Kal錯誤。 Java支持複製構造函數很好,大多數集合類都提供它們。 – chrylis

+1

@chrylis:自動複製構造函數?我不這麼認爲。 –

回答

8

Java對複製構造函數沒有特定的語言支持。相反,你只需在構造函數中手動編寫狀態複製代碼;例如

public class Person { 
    private String firstName; 
    private String lastName; 

    public Person(Person other) { 
     this.firstName = other.firstName; 
     this.lastName = other.lastName; 
    } 
    ... 
} 

我想明白了Java相當於從故事的編譯器端執行的三(拷貝構造函數,析構函數,賦值運算符)的規則邏輯。

複製構造函數如上。真的只是一個(簡單)設計模式。

Java不提供與C++賦值運算符加載等效的操作。 Java支持基本類型和引用類型的分配,但不支持與C++相同的對象分配。在Java中分配值時需要執行特殊操作是非常不尋常的。在需要這樣做的情況下,習慣上將邏輯放入setter方法中。

Java支持finalize方法,它們在某些方面類似於到C++析構函數。主要區別在於finalize方法是對象而不是引用變量的操作,並且它們通常在對象的最後一個引用超出範圍之後被稱爲很長時間。

但是,你很少需要使用finalize方法:

  • Java是一種完全垃圾回收的語言,併爲內存管理的最佳策略是隻讓GC照顧它。

  • 其他資源最好使用「try/finally」或「try with resources」進行管理。

據我所知,唯一的聲音用例爲finalize方法是清理已不慎丟失資源;例如因爲有人忘記用推薦的機制「關閉」他們。

+0

複製通常是爲可變的「值」對象完成的,例如MutableRectangle(如果您需要/想要這樣的類)。對於像Person這樣的「身份」對象/實體來說,它可能並不是很明智/有用。 –

+0

這段代碼片段是正確的想法,但是如果它繼續進行一些深層複製操作(這是手動複製構造函數的目的),它將更具啓發性。字符串和本地標量太簡單了。 –

+1

@ThomasW - 這是一個很好的例子來展示Java如何工作......不是從域角度來看有意義的。請關注答案正在說的內容。 –

5

Java只能引用對象。你不能聲明內聯(堆棧或對象)對象。

拷貝構造函數

Java沒有一個。你可以寫一個,但這很少完成。

,析構函數

Java沒有一個。它有finalize(),但這是非常不鼓勵的。

賦值運算符

Java沒有一個對象,只有對象的引用。

+0

@ johnchen902對不起,它是finalize()http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –