2 回答
TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
如果它是淺拷貝那么它就是引用的副本嗎?
不,它是一個(gè)新數(shù)組,包含對(duì)與原始數(shù)組相同的對(duì)象的引用
我可以對(duì)java中的任何對(duì)象使用clone方法嗎?
Object.clone()不。閱讀和的 javadocCloneable以了解規(guī)則。
如果是這樣,那么可以簡(jiǎn)化以下內(nèi)容(而不是使用 for 循環(huán),我可以使用克???)?
不,因?yàn)?code>clone()會(huì)給你一個(gè)相同長(zhǎng)度的新數(shù)組,因此你將無(wú)法在數(shù)組末尾添加新元素。
TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
如果它是淺拷貝那么它就是引用的副本嗎?
不,它是對(duì)具有該對(duì)象屬性副本的新對(duì)象的新引用。細(xì)節(jié)取決于clone.
我可以對(duì)java中的任何對(duì)象使用clone方法嗎?它復(fù)制引用還是實(shí)際對(duì)象?
首先,clone不是用于數(shù)組淺表復(fù)制的正確工具。您可以改用System.arraycopy。在您的情況下,您會(huì)在末尾為新條目分配一個(gè)帶有空間的數(shù)組,然后將arraycopy原始條目分配給它,然后添加您的條目。
public void add(MarketProduct input) {
MarketProduct[] list = new MarketProduct[marketproducts.length + 1];
System.arraycopy(marketproducts, 0, list, 0, marketproducts.length);
list[list.length-1] = input; this.marketproducts = list;
}顯然這有點(diǎn)貴,您可能會(huì)考慮使用其中一個(gè)List類(lèi)(也許ArrayList),這樣您就不會(huì)每次都增加數(shù)組。
重新clone,請(qǐng)參閱JavaDoc:
創(chuàng)建并返回此對(duì)象的副本。“復(fù)制”的確切含義可能取決于對(duì)象的類(lèi)。一般意圖是,對(duì)于任何對(duì)象x,表達(dá)式:將是真實(shí)的,并且表達(dá)式:x.clone() != x會(huì)x.clone().getClass() == x.getClass()true,但這些都不是絕對(duì)要求。雖然通常情況是:會(huì)x.clone().equals(x)true,這不是絕對(duì)要求。按照約定,返回的對(duì)象應(yīng)該通過(guò)調(diào)用
super.clone. 如果一個(gè)類(lèi)及其所有超類(lèi)(除了Object)都遵守這個(gè)約定,那么x.clone().getClass() == x.getClass().按照慣例,此方法返回的對(duì)象應(yīng)該獨(dú)立于此對(duì)象(正在被克隆)。為了實(shí)現(xiàn)這種獨(dú)立性,可能需要在
super.clone返回之前修改返回對(duì)象的一個(gè)或多個(gè)字段。通常,這意味著復(fù)制包含被克隆對(duì)象的內(nèi)部“深層結(jié)構(gòu)”的任何可變對(duì)象,并將對(duì)這些對(duì)象的引用替換為對(duì)副本的引用。如果一個(gè)類(lèi)只包含原始字段或?qū)Σ豢勺儗?duì)象的引用,那么通常情況下返回的對(duì)象中沒(méi)有字段需要super.clone修改。
clone類(lèi)的 方法Object執(zhí)行特定的克隆操作。首先,如果這個(gè)對(duì)象的類(lèi)沒(méi)有實(shí)現(xiàn)接口Cloneable,那么CloneNotSupportedException拋出一個(gè)。請(qǐng)注意,所有數(shù)組都被視為實(shí)現(xiàn)接口,并且數(shù)組類(lèi)型方法的Cloneable返回類(lèi)型 是其中 T 是任何引用或原始類(lèi)型。否則,此方法會(huì)創(chuàng)建此對(duì)象類(lèi)的新實(shí)例,并使用此對(duì)象相應(yīng)字段的內(nèi)容來(lái)初始化其所有字段,就像通過(guò)賦值一樣;字段的內(nèi)容本身不是克隆的。因此,此方法執(zhí)行此對(duì)象的“淺拷貝”,而不是“深拷貝”操作。cloneT[]T[]該類(lèi)
Object本身不實(shí)現(xiàn)該接口Cloneable,因此clone在其類(lèi)是的對(duì)象上調(diào)用該方法Object將導(dǎo)致在運(yùn)行時(shí)拋出異常。
所以你不能在沒(méi)有實(shí)現(xiàn)的對(duì)象上使用它Cloneable,但你可以在實(shí)現(xiàn)的對(duì)象上使用它。
添加回答
舉報(bào)
