当前位置: 代码迷 >> Java相关 >> clone步骤的使用
  详细解决方案

clone步骤的使用

热度:17   发布时间:2016-04-22 20:57:57.0
clone方法的使用
import java.util.Arrays;

public class Test {
    static void fun(int a[]){
        int array[]=a.clone();
        array[0]=-1;  
    }
    static void fun(int b[][]){
        // int array[][]=b;
        int array[][]=b.clone();
        //为什么这里没有复制b引用的对象呢?而上面一维数组却复制了
        array[0][0]=-2;  
    }
    public static void main(String[] args){
        int one[]={1,2,3};
        int two[][]={{1,2},{3,4,5}};
        fun(one);
        fun(two);
        
        //输出
        System.out.println("一维数组:"+Arrays.toString(one));
        System.out.print("二维数组:");       
        for(int n[]:two)
            System.out.print(Arrays.toString(n));
    }
}


输出结果为:
一维数组:[1, 2, 3]
二维数组:[-2, 2][3, 4, 5]

------解决思路----------------------
查了一下clone的详解,觉得在这里可能是因为clone是浅拷贝,a的clone,因为里面存放的不是对象,而是一个基本数据类型,所以clone直接在内存里面重新开辟了一块内存,用来存放新的数值,而b里面存放了2个对象,clone的时候是不会重新开辟空间建立新的对象的,只会拷贝索引,所以会出现对b的拷贝的修改会影响b本体,具体的可以看看这里
http://blog.csdn.net/zhangjg_blog/article/details/18369201
------解决思路----------------------
java克隆时,如果克隆的对象的各属性都是简单数据项,那么克隆出来的结果无误,也就是浅拷贝。
如果对象的属性中存在引用的话,那克隆出来的对象会和原对象指向相同的引用地址,这时候想克隆,需要深拷贝。

clone并不能直接作用于二维数组。
因为java中没有二维数组的概念,只有数组的数组。
所以二维数组int array[][] 中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。


------解决思路----------------------
http://www.java3z.com/cwbwebhome/article/article8/83567.html?id=4690
java的二维数组其实不是真正意义上的二维数组
这里面有讲到,网上搜来的
  相关解决方案