关于深拷贝、浅拷贝
可以直观的看到,深拷贝就是复制前后的对象除了值相等以外,是完全没有关系的;而浅拷贝仅仅复制了原对象的引用,二者随意修改值的内容,都会导致另一个对象的值发送变化。
Java中如何进行拷贝?
首先,Java中除了8种基本数据类型,其余都是对象,并且对象有一个公共的父类Object
,在Object
中有clone()
方法,可以实现深拷贝。
protected native Object clone() throws CloneNotSupportedException;
clone()是受保护类型,因此在子类中必须重写此方法,而且重写之后应该扩大访问权限,这样它才能被外部调用。但是具体的复制方法实现还是在Object中,因此在覆写方法中只需要调用Object类中的clone()方法即可完成操作,而且在对象所在类中必须实现Cloneable接口才可以完成对象的复制操作。
浅拷贝:直接通过等号赋值的可变对象就是浅拷贝,只能得到相同的引用;
深拷贝:通过如下例子,实现Cloneable类,重新定义clone方法,抛出CloneNotSupportedException
异常,就可以调用clone方法实现深拷贝了。可以看到rawObj的属性变化并没有影响newObj的属性值,而obj的属性值是随着rawObj变化的,前者为深拷贝,后者为浅拷贝。
euqals方法进行比较相等就说明两个对象的值是相等的,使用全等号==进行比较就说明这两个对象引用的是同一个对象!
public class CloneDemo implements Cloneable {
public String name;
public CloneDemo(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
cloneDemo rawObj = new cloneDemo("a"