2 回答
TA貢獻1824條經驗 獲得超8個贊
是否有任何東西阻止 Java 創建隱式復制構造函數,它會在所有成員上調用復制構造函數?
主要是這顯然不是它應該做的事情。
在這種情況下,也許你想要一個深拷貝;在這種情況下,也許你想要一個淺拷貝;也許您根本不希望在另一種情況下復制實例;也許您希望以這些方式混合復制特定類的字段。
此外,添加此構造函數是另一種方法:在方法數量很重要的環境中(例如 Android 的 64k Dex 限制),您為不需要的東西付費。
如果需要,最好通過明確的方式讓您這樣做。
但是是什么阻止了Java 擁有這個呢?
鑒于您可以手動定義復制構造函數,自動添加它們在技術上顯然是可行的。
我建議你不能這樣做的一個原因是沒有語言機制可以“刪除”你不想被復制的類的構造函數。
很容易表明您不想要默認 ctor:只需使用任何簽名定義您自己的 ctor。但是你不能對默認的復制 ctor 做同樣的事情:根據定義,復制 ctor 只會有簽名YourClass(YourClass instance);所以你不能要求,比如說,你定義一個拋出的顯式復制ctor,因為你已經將編譯時錯誤(不存在這樣的ctor)更改為運行時錯誤(它存在,但拋出)。
因此,您必須開始發明額外的機制來刪除構造函數——比如說,一個特殊的注釋。但這需要更改工具來支持它。
從絕對意義上說,這并非不可能——但需要大量工作來更改語言以添加可以在現有語言中實現的功能。
TA貢獻1836條經驗 獲得超4個贊
但確實如此。它是在類中調用clone()并實現的方法Object。
所以你想要做的,可以通過以下方式實現:
MyClass obj = new MyClass(); MyClass copy = (MyClass) obj.clone();
添加回答
舉報
