第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

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

2 回答

?
有只小跳蛙

TA貢獻1824條經(jīng)驗 獲得超8個贊

是否有任何東西阻止 Java 創(chuàng)建隱式復制構造函數(shù),它會在所有成員上調(diào)用復制構造函數(shù)?

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

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

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

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


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

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

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

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

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

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


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

TA貢獻1836條經(jīng)驗 獲得超4個贊

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

所以你想要做的,可以通過以下方式實現(xiàn):

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


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號