Object的clone()方法、深拷贝、浅拷贝
obj.clone().getClass()==obj.getClass(),即它们具有相同的类型。还有一点,因为只是简单的将对象的空间进行复制,所以如果类具有引用类型的实例变量的话,也只是将这个引用进行拷贝,并不复制其引用的对象。这就导致拷贝对象的引用实例变量与原对象的指向相同的对象,这就是传说中的“浅拷贝”。如果实例变量引用的对象是不可变的,类似于String,则拷贝对象与原对象不能互相影响,这样的拷贝是成功的。但是如果引用的是可变对象,它们就会影响彼此,对于成功的拷贝而言,这是不允许的。可以对可变的实例变量对象进行特殊处理,以实现拷贝对象和原对象不能相互影响的“深拷贝”。
由于Object.clone()方法是protected的,所以它只能在lang包中的类或是其子类的方法内部被调用,所以,如果像下面这样调用,会编译出错,在Person kobe_bak=kobe.clone();报错,说clone只能在Object的protected作用域访问。
class Person implements Cloneable { private int age; private String name; private Date birth; public Person(int a,String n,Date b){ age=a; name=n; birth=b; } public static void main(String[] args){ Person kobe=new Person(33,"kobe",new Date()); Person kobe_bak=kobe.clone(); } @Override public Object clone(){ Person p=(Person)super.clone(); //Date类型的birth域是可变变的,需要对其克隆,进行深拷贝 //Date类实现的克隆,直接调用即可 p.birth=this.birth.clone(); return p; } }