自定义类实现自我克隆
-
自定义类实现 Cloneable 接口。这是一个标记接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法。
-
自定义类实现自己的 clone ()方法。
-
实现clone()方法时通过 super。clone();调用 Object实现的clone() 方法来得到对象的副本,并返回该副本。
package com.hans.myClass;
class Address {
String detail;
public Address(String detail) {
this.detail = detail;
}
}
//实现 Cloneable 接口
class User implements Cloneable {
int age;
Address address;
public User(int age) {
this.age = age;
address = new Address("西安高新");
}
@Override
protected User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User user1 = new User(22);
User user2 = user1.clone();
System.out.println(user1 == user2);//返回false
System.out.println(user1.address == user2.address);//返回true
}
}
Object 类提供的Clone 机制只对对象里个实例变量进行“简单复制”,如果实例变量的类型是饮用类型,Object 的 Clone 机制也只是简单地复制这个引用变量,这样原对象的引用类型的实例变量与克隆对象的引用类型的实例变量依然只想内存中的同一个实例。
Object 类提供的 Clone()方法逼近能简单地“复制”对象问题,而且这种“自我克隆”机制十分高效。比如 clone 一个包含 100 个元素的 int[] 数组,用系统默认 clone 方法比静态 copy 方法快近两倍。