码迷,mamicode.com
首页 > 编程语言 > 详细

Java深拷贝和浅拷贝

时间:2019-01-07 23:10:29      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:port   rgs   定义   obj   highlight   测试   private   out   stat   

浅拷贝和深拷贝

在具体解释Java深拷贝和浅拷贝之前,我们先看个例子,代码如下:

public class Thing implements Cloneable {
    // 定义一个私有变量
    private ArrayList<String> arraylist = new ArrayList<String>();

    @Override
    public Thing clone() {
        Thing thing = null;
        try {
            thing = (Thing)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return thing;
    }

    public void setValue(String value) {
        this.arraylist.add(value);
    }

    public ArrayList<String> getValue() {
        return this.arraylist;
    }
}

 

下面看一下浅拷贝测试:

 1 public class Client {
 2     public static void Main(String[] args) {
 3         Thing thing = new Thing();
 4         thing.setValue("张三");
 5 
 6         // 拷贝一个对象
 7         Thing cloneThing = thing.clone();
 8         cloneThing.setValue("李四");
 9 
10         // 打印结果是[张三,李四]
11         System.out.println(thing.getValue());
12     }
13 }

这里java做了一个偷懒的拷贝动作,Object类提供的clone()方法只是提供了拷贝本地对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生的内部元素地址,这种拷贝称为浅拷贝。

 

那么下面看一下如何深拷贝??

 1 public class Thing implements Cloneable {
 2     // 定义一个私有变量
 3     private ArrayList<String> arraylist = new ArrayList<String>();
 4 
 5     @Override
 6     public Thing clone() {
 7         Thing thing = null;
 8         try {
 9             thing = (Thing)super.clone();
10             
11             // 深度拷贝加上这句
12             thing.arraylist = (ArrayList)this.arraylist.clone();
13         } catch (CloneNotSupportedException e) {
14             e.printStackTrace();
15         }
16 
17         return thing;
18     }
19 
20     public void setValue(String value) {
21         this.arraylist.add(value);
22     }
23 
24     public ArrayList<String> getValue() {
25         return this.arraylist;
26     }
27 }

另外最后注意一下对象的clone()方法和对象内的final关键词是冲突的

Java深拷贝和浅拷贝

标签:port   rgs   定义   obj   highlight   测试   private   out   stat   

原文地址:https://www.cnblogs.com/wylwyl/p/10236177.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!