亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Java 不提供默認的復制構造函數?

為什么 Java 不提供默認的復制構造函數?

慕森卡 2022-05-12 15:34:45
我知道以下代碼段僅創建對某處存在的對象的新引用:MyClass obj = new MyClass(); MyClass copy = obj;但是為什么 Java 在以下情況下不提供默認的復制構造函數:MyClass obj = new MyClass(); MyClass copy = new MyClass(obj);我相信隱式復制構造函數可以做一些類似于 C++ 的事情,即在每個成員上調用復制構造函數。這將導致對象的深拷貝,假設所有管理資源的類都正確地實現了它們的拷貝構造函數。添加這樣的功能也應該是向后兼容的,因為現在如果沒有該類的顯式復制構造函數,第二個片段將無法編譯。所以,為了讓我的問題更準確:是否有任何東西阻止 Java 創建隱式復制構造函數,它會在所有成員上調用復制構造函數?現在添加隱式復制構造函數可能會破壞任何現有程序嗎?
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻1824條經驗 獲得超8個贊

是否有任何東西阻止 Java 創建隱式復制構造函數,它會在所有成員上調用復制構造函數?

主要是這顯然不是它應該做的事情。

在這種情況下,也許你想要一個深拷貝;在這種情況下,也許你想要一個淺拷貝;也許您根本不希望在另一種情況下復制實例;也許您希望以這些方式混合復制特定類的字段。

此外,添加此構造函數是另一種方法:在方法數量很重要的環境中(例如 Android 的 64k Dex 限制),您為不需要的東西付費。

如果需要,最好通過明確的方式讓您這樣做。


但是是什么阻止了Java 擁有這個呢?

鑒于您可以手動定義復制構造函數,自動添加它們在技術上顯然是可行的。

我建議你不能這樣做的一個原因是沒有語言機制可以“刪除”你不想被復制的類的構造函數。

很容易表明您不想要默認 ctor:只需使用任何簽名定義您自己的 ctor。但是你不能對默認的復制 ctor 做同樣的事情:根據定義,復制 ctor 只會有簽名YourClass(YourClass instance);所以你不能要求,比如說,你定義一個拋出的顯式復制ctor,因為你已經將編譯時錯誤(不存在這樣的ctor)更改為運行時錯誤(它存在,但拋出)。

因此,您必須開始發明額外的機制來刪除構造函數——比如說,一個特殊的注釋。但這需要更改工具來支持它。

從絕對意義上說,這并非不可能——但需要大量工作來更改語言以添加可以在現有語言中實現的功能。


查看完整回答
反對 回復 2022-05-12
?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

但確實如此。它是在類中調用clone()并實現的方法Object。

所以你想要做的,可以通過以下方式實現:

MyClass obj = new MyClass(); 
MyClass copy = (MyClass) obj.clone();


查看完整回答
反對 回復 2022-05-12
  • 2 回答
  • 0 關注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號