java的cloneable_关于Java cloneable

克隆是一种基本的编程模式。事实上,Java在很多方面可能实现得很差,但这丝毫没有减少克隆的必要性。而且,很容易实现克隆,无论你希望它如何工作,浅层的,深层的,混合的,无论什么。如果愿意的话,甚至可以为函数使用clone名称,而不实现Cloneable。

假设我有类A、B和C,其中B和C是从A派生的。如果我有一个A类型的对象列表,如下所示:

ArrayList list1;

ArrayList list2 = new ArrayList();

for(A a : list1) {

list2.add(new A(a));

}

如果对象实际上是B或C类型的,则不会得到正确的副本。如果A是抽象的呢?现在,有人提出:

ArrayList list2 = new ArrayList();

for(A a : list1) {

if(a instanceof A) {

list2.add(new A(a));

} else if(a instanceof B) {

list2.add(new B(a));

} else if(a instanceof C) {

list2.add(new C(a));

}

}

你想做的是:

ArrayList list2 = new ArrayList();

for(A a : list1) {

list2.add(a.clone());

}

很多人都指出了克隆的基本Java实现存在问题的原因。但是,这样很容易克服:

public A clone() {

return new A(this);

}

B类:

@Override

public B clone() {

return new B(this);

}

C类:

@Override

public C clone() {

return new C(this):

}

Java中的`Cloneable`接口是一个标记接口,用于指示实现类可以被克隆。它并不包含任何方法,只是作为一个标记,告诉编译器该类可以被克隆。 要实现`Cloneable`接口,只需在类的声明中添加`implements Cloneable`,然后重写`Object`类中的`clone()`方法。 以下是一个示例: ```java public class Person implements Cloneable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } public static void main(String[] args) { Person person1 = new Person("Alice", 25); try { Person person2 = (Person) person1.clone(); System.out.println(person2.name); // 输出:Alice System.out.println(person2.age); // 输出:25 } catch (CloneNotSupportedException e) { e.printStackTrace(); } } } ``` 在上面的示例中,`Person`类实现了`Cloneable`接口,并重写了`clone()`方法。在`main()`方法中,我们创建了一个`Person`对象`person1`,然后使用`clone()`方法创建了一个新的对象`person2`。最后,我们打印了新对象的属性,验证克隆是否成功。 需要注意的是,使用`clone()`方法进行对象的浅拷贝(shallow copy),即基本数据类型会被复制,而引用类型只是复制了引用,指向同一块内存。如果需要实现深拷贝(deep copy),需要在`clone()`方法中对引用类型进行逐个复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值