今天在编程中遇到发现一个问题,那就是二维数组的clone,只有第一层clone了,里层的还是指向之前的地址
String[] a = {"1","2"};
String[] aa = a.clone();
aa[0] = "22";
System.out.println(a[0]); //打印 1
String[][] e = {{"0","1"},{"r","b"}};
String[][] ee = e.clone();
ee[0][0] = "22";
System.out.println(e[0][0]); //打印22
于是 就想到,clone() 函数 是不是对带引用的成员变量(非String的对象)都没有clone.
写了如下代码测试
B b = new B("bp");
A a = new A(b, "ap");
A aa = a.clone();
aa.setParam("aap");
aa.getB().setParam("bbp");
System.out.println(a.getParam());
System.out.println(a.getB().getParam());
//打印结果:ap bbp
debug:
很明显可以看到 aa的成员变量b 和 a的成员变量b 还是一个引用。
结论:
调用clone方法时,先
分配内存,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域