2 回答
TA贡献1852条经验 获得超1个赞
如果它是浅拷贝那么它就是引用的副本吗?
不,它是一个新数组,包含对与原始数组相同的对象的引用
我可以对java中的任何对象使用clone方法吗?
Object.clone()
不。阅读和的 javadocCloneable
以了解规则。
如果是这样,那么可以简化以下内容(而不是使用 for 循环,我可以使用克隆?)?
不,因为clone()
会给你一个相同长度的新数组,因此你将无法在数组末尾添加新元素。
TA贡献1820条经验 获得超10个赞
如果它是浅拷贝那么它就是引用的副本吗?
不,它是对具有该对象属性副本的新对象的新引用。细节取决于clone
.
我可以对java中的任何对象使用clone方法吗?它复制引用还是实际对象?
首先,clone
不是用于数组浅表复制的正确工具。您可以改用System.arraycopy
。在您的情况下,您会在末尾为新条目分配一个带有空间的数组,然后将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; }
显然这有点贵,您可能会考虑使用其中一个List
类(也许ArrayList
),这样您就不会每次都增加数组。
重新clone
,请参阅JavaDoc:
创建并返回此对象的副本。“复制”的确切含义可能取决于对象的类。一般意图是,对于任何对象x
,表达式:将是真实的,并且表达式:x.clone() != x会x.clone().getClass() == x.getClass()true
,但这些都不是绝对要求。虽然通常情况是:会x.clone().equals(x)true
,这不是绝对要求。按照约定,返回的对象应该通过调用
super.clone
. 如果一个类及其所有超类(除了Object
)都遵守这个约定,那么x.clone().getClass() == x.getClass()
.按照惯例,此方法返回的对象应该独立于此对象(正在被克隆)。为了实现这种独立性,可能需要在
super.clone
返回之前修改返回对象的一个或多个字段。通常,这意味着复制包含被克隆对象的内部“深层结构”的任何可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类只包含原始字段或对不可变对象的引用,那么通常情况下返回的对象中没有字段需要super.clone
修改。
clone
类的 方法Object
执行特定的克隆操作。首先,如果这个对象的类没有实现接口Cloneable
,那么CloneNotSupportedException
抛出一个。请注意,所有数组都被视为实现接口,并且数组类型方法的Cloneable
返回类型 是其中 T 是任何引用或原始类型。否则,此方法会创建此对象类的新实例,并使用此对象相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。clone
T[]
T[]
该类
Object
本身不实现该接口Cloneable
,因此clone
在其类是的对象上调用该方法Object
将导致在运行时抛出异常。
所以你不能在没有实现的对象上使用它Cloneable
,但你可以在实现的对象上使用它。
添加回答
举报