java Object 类中clone方法用法记录

                             java Object 类中clone方法用法记录

 

一、clone方法使用步骤

1、在当前类中实现接口: java.lang.Cloneable

2、重写 clone方法,将访问修饰符由 protected 调整 public

二、浅克隆

1、 浅克隆: 当前对象中 引用类型 和 克隆后的对象中引用类型 数据共享,容易引起变量污染。

2、 定义一个类 ShadowClone,里面有基本数据类型和引用数据类型。

/**
* description: shadow 浅克隆
* @version v1.0
* @author w
* @date 2018年7月18日上午10:40:07
*/
public class ShadowClone implements Cloneable{

    private int age ;

    private int[] ages ;

    /**
    * 重写父类的 clone 方法
    * @throws CloneNotSupportedException
    */
    @Override
    protected ShadowClone clone() throws CloneNotSupportedException {
        return (ShadowClone)super.clone();
    }

    @Override
    public String toString() {
        return "ShadowClone [age=" + age + ", ages=" + Arrays.toString(ages) + "]";
    }

    // 省略 getter , setter 方法
}

3、 定义 ShadowTest 针对 ShadowClone 类的测试

/**
* description: 针对 浅 clone 的测试
* @version v1.0
* @author w
* @date 2018年7月18日上午10:41:56
*/
public class ShadowTest {

    public static void main(String[] args) throws Exception{
        ShadowClone s1 =new ShadowClone();
        s1.setAge(111);
        s1.setAges(new int[]{1,2,3});
        System.out.println("克隆前:"+s1);
       
        ShadowClone s2 = s1.clone();
        System.out.println("克隆后:"+s2);
        System.out.println(s1 == s2); // false ---> 地址值不一致,说明克隆后的对象和克隆前的对象不是同一个对象。
        System.out.println(s1.getAge() == s2.getAge()); // true
        System.out.println(s1.getAges() == s2.getAges()); // true ---> 数组引用类型,地址值一致,说明共享了。
    }

}

三、 深克隆

1、深克隆:和浅克隆相对,当前对象中引用类型和克隆后对象中引用类型 数据不共享,从而可以避免变量污染。

2、 定义一个类 DeepClone,重写clone方法,对引用类型数据也进行克隆。

/**
* description: 深度clone, 类中引用类型都需要进行深度clone
* @version v1.0
* @author w
* @date 2018年7月18日上午11:02:46
*/

public class DeepClone implements Cloneable{

    private String name ;

    private int age ;

    private int[] ages;

    /**
    * 重写clone方法,对当前类中引用类型数据也进行克隆
    */
    @Override
    public DeepClone clone() throws CloneNotSupportedException {
        DeepClone deep =(DeepClone)super.clone();
        deep.ages=Arrays.copyOf(ages, ages.length);
        deep.name=new String(name);
        return deep;
    }

    @Override
    public String toString() {
        return "DeepClone [name=" + name + ", age=" + age + ", ages=" + Arrays.toString(ages) + "]";
    }

    // 省略 getter , setter 方法
}

 

3、定义 DeepTest 针对 DeepClone 类的测试

/**
* description: 针对深度clone 的测试
* @version v1.0
* @author w
* @date 2018年7月18日上午11:06:03
*/
public class DeepTest {

    public static void main(String[] args) throws Exception{
        DeepClone d = new DeepClone();
        d.setAge(111);
        d.setAges(new int []{111,222,333});
        d.setName("淘宝");
        System.out.println(d);

        DeepClone d2 = d.clone();
        System.out.println(d2);
        System.out.println(d == d2); // false
        System.out.println(d.getAges() == d2.getAges()); // false
        System.out.println(d.getName() == d2.getName()); // false
    }
}

 

四、总结

1、clone方法,用于对象的拷贝,使用前提是:

  • 当前类必须实现 java.lang.Cloneable接口,

  • 重写 clone 方法

2、不使用 new 关键字创建对象, clone 方法算是一种 。

3、clone 默认的是浅拷贝,要想实现深度拷贝,必须手动对需要拷贝对象中的引用类型数据手动逐一拷贝。

 

 

五、参考资料

1、 这里只是简单的介绍了下 clone 方法的使用,要了解更多请参考以下大佬的博文:

 

PS: 2018年7月18日 13:46:15  csdn zz的产品,改了富文本编辑器,反人类无法使用!!  文章格式惨不忍睹, 不想整格式了,需要源码or原带格式的文章,请私信!! 

  强烈鄙视csdn 不顾用户感受,一刀切的做法,。。 再次鄙视,,谢谢!

 

PS2: 2018年7月26日 11:17:26  今天 静下心来,新版的文本编辑器还可以用~  只是原来没有适应而已~ 作为一个coder,必须要学会适应一切新生事务呀~

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章