Java的浅拷贝与深拷贝
对于基本类型来说,它们之间的复制很简单,比如
class D{
private int i = 2;
public String toString() {
return i+"";
}
public void setI(int d) {
this.i = d;
}
}
public class TestCase {
public static void main(String[] args) {
int i = 1;
int j = i;
i++;
System.out.println("i="+i); // i = 2
System.out.println("j="+j); // j = 1
D d1 = new D();
D d2 = d1;
System.out.println("d1.i= "+d1); //d1 = 2
System.out.println("d2.i= "+d2); //d2 = 2
System.out.println("修改d1 的值");
d1.setI(3);
System.out.println("d1.i= "+d1); // d1 = 3
System.out.println("d2.i= "+d2); // d2 = 3
}
}从上面可以看出,对于i 和 j 是完全不同两个变量,但对于 d1 和 d2 来说 他们是完全相同的.对于对象的复制 Java在object 类中提供了clone()
方法 .在子类中覆盖此方法,就可以实现对象的复制. 该对象必须实现Cloneable 接口,否则会抛CloneNotSupportedException继承自java.lang.Object类的clone()方法是浅复制。
class E{
private int j;
public E(int j){
this.j = j;
}
public String toString() {
return j+"";
}
public void SetJ(int j) {
this.j = j;
}
}
class D implements Cloneable {
private int i = 2;
private E d = new E(4);
public String toString() {
return i+"";
}
public void setI(int d) {
this.i = d;
}
public String getString() {
return d.toString();
}
public E getE() {
return d;
}
public D clone() throws CloneNotSupportedException{
return (D) super.clone();
}
}
public class TestCase {
public static void main(String[] args) throws CloneNotSupportedException {
D d1 = new D();
D d2 = d1.clone();
System.out.println("d1.i= "+d1); //d1.i = 2
System.out.println("d2.i= "+d2); //d2.i = 2
d1.setI(4);
System.out.println("d1.i= "+d1); //d1.i = 4
System.out.println("d2.i= "+d2); //d2.i = 2
System.out.println("d1.e.j= "+d1.getString()); //d1.e.j = 4
System.out.println("d2.e.j= "+d2.getString()); //d1.e.j = 4
E e = d1.getE();
e.SetJ(6);
System.out.println("d1.e.j= "+d1.getString()); //d1.e.j = 6
System.out.println("d2.e.j= "+d2.getString()); //d1.e.j = 6
}
}对于基本类型复制值,类类型复制引用.所以修改d1的E对象状态(j),会修改所有从d1克隆出来的对象的E的状态.因而我们需要深拷贝
class E implements Cloneable{
private int j;
public E(int j){
this.j = j;
}
public String toString() {
return j+"";
}
public void SetJ(int j) {
this.j = j;
}
public E clone() throws CloneNotSupportedException{
return (E) super.clone();
}
}
class D implements Cloneable {
private int i = 2;
private E d = new E(4);
public String toString() {
return i+"";
}
public void setI(int d) {
this.i = d;
}
public String getString() {
return d.toString();
}
public E getE() {
return d;
}
public D clone() throws CloneNotSupportedException{
D d1 = (D)super.clone();
d1.d=d.clone();
return d1;
}
}
public class TestCase {
public static void main(String[] args) throws CloneNotSupportedException {
D d1 = new D();
D d2 = d1.clone();
System.out.println("d1.i= "+d1); //d1.i =2
System.out.println("d2.i= "+d2); //d1.i = 2
d1.setI(4);
System.out.println("d1.i= "+d1); // d1.i = 4
System.out.println("d2.i= "+d2); //d2.i = 2
System.out.println("d1.e.j= "+d1.getString()); //d1.e.j = 4
System.out.println("d2.e.j= "+d2.getString()); //d2.e.j = 4
E e = d1.getE();
e.SetJ(6);
System.out.println("d1.e.j= "+d1.getString()); //d1.e.j =6
System.out.println("d2.e.j= "+d2.getString()); //d2.e.j = 4
}
}

浙公网安备 33010602011771号