我很好奇Java如何支持拷貝構造函數,它與C++有何不同?我想了解從編譯器端執行三條規則(複製構造函數,析構函數,賦值運算符)的邏輯的Java等價物。Java與C++拷貝構造函數的區別
回答
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
方法是清理已不慎丟失資源;例如因爲有人忘記用推薦的機制「關閉」他們。
複製通常是爲可變的「值」對象完成的,例如MutableRectangle(如果您需要/想要這樣的類)。對於像Person這樣的「身份」對象/實體來說,它可能並不是很明智/有用。 –
這段代碼片段是正確的想法,但是如果它繼續進行一些深層複製操作(這是手動複製構造函數的目的),它將更具啓發性。字符串和本地標量太簡單了。 –
@ThomasW - 這是一個很好的例子來展示Java如何工作......不是從域角度來看有意義的。請關注答案正在說的內容。 –
Java只能引用對象。你不能聲明內聯(堆棧或對象)對象。
拷貝構造函數
Java沒有一個。你可以寫一個,但這很少完成。
,析構函數
Java沒有一個。它有finalize()
,但這是非常不鼓勵的。
賦值運算符
Java沒有一個對象,只有對象的引用。
@ johnchen902對不起,它是finalize()http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#finalize() –
- 1. 拷貝構造函數的區別?
- 2. Java的ArrayList的拷貝構造函數
- 3. 的拷貝構造函數
- 4. Java的拷貝構造函數
- 5. 基類的拷貝構造函數(C++)
- 6. C++中的拷貝構造函數
- 7. C++默認的拷貝構造函數
- 8. 拷貝構造函數
- 9. 拷貝構造函數knowlege
- 10. 拷貝構造函數++
- 11. Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
- 12. C++幫助拷貝構造函數
- 13. C++中拷貝構造函數
- 14. 拷貝構造函數在C++
- 15. 拷貝構造函數和operator =在C++
- 16. 通用C#拷貝構造函數
- 17. C++拷貝構造函數語法
- 18. C#泛型拷貝構造函數
- 19. c#拷貝構造函數生成器
- 20. 指針和拷貝構造函數C++
- 21. 拷貝構造函數類C++
- 22. C++編程拷貝構造函數
- 23. C++默認拷貝構造函數
- 24. C++拷貝構造函數怪異
- 25. 拷貝構造函數在C++
- 26. C++ std :: auto_ptr拷貝構造函數
- 27. 拷貝構造函數與鄰接表
- 28. 用模板拷貝構造函數替換默認拷貝構造函數
- 29. 拷貝構造函數和函數從
- 30. D結構體拷貝構造函數
不,java僅支持對類的引用,而C++支持值和引用,所以java不支持複製ctors,dtors或賦值操作 – Kal
@Kal錯誤。 Java支持複製構造函數很好,大多數集合類都提供它們。 – chrylis
@chrylis:自動複製構造函數?我不這麼認爲。 –