对象的拷贝就是将一个对象的属性都拷贝到另一个有着相同类类型的对象中。
1 浅拷贝
如果属性是值类型,就会拷贝属性的值,如果属性是引用类型(内存地址),拷贝的就是内存地址。这种情况下,一个对象的引用类型的属性值改变,就会影响到另一个对象。
实现方法:对象类实现Cloneable接口后,重写clone方法,在方法内部调用super.clone()。
public class Student implements Cloneable { Father father; String address; TestStream(String address, String name) { father = new Father(name); address = address; } // 重写clone方法 @Override public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException ex) { return null; } } }
2 深拷贝
会拷贝所有属性,并拷贝引用类型的属性指向的内存。即将对象和它所引用的对象一起拷贝,就是深拷贝。相比于浅拷贝,深拷贝速度慢,开销大。
深拷贝后,改变被拷贝的引用类型的属性值,不会影响到拷贝后的属性值。
实现方法:对象类实现Cloneable接口后,重写clone(),在clone方法中创建拷贝类的一个新对象。
public class Student implements Cloneable { Father father; String address; TestStream(String address, String name) { father = new Father(name); address = address; } // 重写clone方法 @Override public Object clone() { return new TestStream(address, father.getName()); } }
3 序列化可以实现深拷贝
序列化可以将一个对象持久化到磁盘中,然后再反序列化到一个新的对象。(使用序列化来进行深拷贝时,必须确保对象的所有属性都是可序列化的)
这种放是与clone相比,性能差,比较耗时,不建议使用。
4 数组的拷贝
String[] array = new String[]{};
有array.clone() 和 Arrays.copyOf(array) 方法,这两个都是浅拷贝。