我想创建一个具有相同父类的对象的列表/数组,然后我将它用于参考.但我不知道如何克隆这些对象来制作一个新对象.
这是一个例子
BigFoo a;
SmallFoo b;
ChickenFoo c;
List foos;
foos.add(a);
foos.add(b);
foos.add(c);
Foo foo = foos.get(1).clone();
但在Java中我发现默认函数中没有克隆函数.我想知道这是如何实现的?
解决方法:
一般建议:使用复制构造函数.事实上,只有一个类本身知道如何创建自己的克隆.没有类可以克隆另一个类的实例.这个想法是这样的:
public class Foo {
public List bars = new ArrayList();
private String secret;
// Copy constructor
public Foo(Foo that) {
// new List
this.bars = new ArrayList();
// add a clone of each bar (as an example, if you need "deep cloning")
for (Bar bar:that.bars) {
this.bars.add(new Bar(bar));
}
// clone the secret value
this.secret = new String(that.secret);
}
// ...
}
因此,如果我们想要克隆foo,我们只需基于foo创建一个新的:
Foo clonedFoo = new Foo(foo);
这是克隆实例的推荐方法.
复制构造函数适用于继承.考虑一个子类
public ChildFoo extends Foo {
private int key;
public ChildFoo(ChildFoo that) {
super(that);
this.key = that.key;
}
}
Foo有一个拷贝构造函数,而ChildFoo只是从它自己的拷贝构造函数中调用它.
你的例子是可能的,但不可取.会发生什么:
Foo a = new Foo();
ChildFoo b = new ChildFoo(a);
这需要ChildFoo上的构造函数,如:
public ChildFoo(Foo that) {
// call the copy constructor of Foo -> no problem
super(that);
// but how to initialize this.key? A Foo instance has no key value!
// Maybe use a default value?
this.key = 0;
}
技术上不是挑战,但b不是a的克隆,因为对象不具有相同的类型.所以这(你的例子)不是克隆.
标签:java
来源: https://codeday.me/bug/20190721/1496621.html