关闭

java 克隆 clone

标签: stringjava指针对象
81人阅读 评论(0) 收藏 举报
分类:

一、介绍

java中没有指针概念,所以存在对象的引用问题。如果对象作为参数传递或者直接使用=其实都是对对象的引用。也就是你修改第二个对象的同时第一个对象的内容也改变了。二者地址相同。所以java中需要通过继承Cloneable接口实现对象的克隆。

二、浅Clone

浅克隆又称影子克隆。一般情况下适用于java基本数据类型和string类型。对于复杂类型无法满足要求。

package test;

public class CloneTest implements Cloneable {
    public String name;

    public Object clone() {
        Object clone = null;
        try{
            clone = super.clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return clone;
    }

    public static void main(String[] args){
        CloneTest test = new CloneTest();
        CloneTest copyTest = new CloneTest();
        test.name = "AAAA";
        copyTest = (CloneTest)test.clone();
        copyTest.name = "BBBB";
        System.out.println(test.name);
        System.out.println(copyTest.name);
    }
}

三、深Clone

对于复杂成员,vector、数组之类的需要采用深层克隆。

package test;

public class CloneTest implements Cloneable {
    public String[] name = new String[2];

    public Object clone() {
        CloneTest clone = null;  //注意申明的对象,后面调用clone.name需要类中有此类型
        try{
            clone = (CloneTest)super.clone();
            clone.name = (String[])name.clone();
        } catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return clone;
    }

    public static void main(String[] args){
        CloneTest test = new CloneTest();
        CloneTest copyTest = new CloneTest();
        test.name[0] = "AAAA";
        test.name[1] = "AA11";
        copyTest = (CloneTest)test.clone();
        copyTest.name[0] = "BBBB";
        copyTest.name[1] = "BB11";
        System.out.println(test.name[0]);
        System.out.println(copyTest.name[0]);
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:88570次
    • 积分:3007
    • 等级:
    • 排名:第11800名
    • 原创:220篇
    • 转载:6篇
    • 译文:0篇
    • 评论:9条
    博客专栏
    文章分类