Java:关于深复制与浅复制

来源:互联网 发布:杭州龙席网络官网 编辑:程序博客网 时间:2024/06/06 14:09

为什么会有深复制和浅复制这两个概念呢?首先,我们想一下,对于基本数据类型,jvm采用的值传递;对于引用类型,JVM采用的是地址传递。我们设想 有这么一段程序:

Obj a=new Obj();

Obj b=a;

显然,在这里,引用变量a和b,都指向了同一个对象,任意改变a或者b,都将会使对方发生相同的改变。那么如果我们只想改变a而不想改变b,怎么办呢?这里就需要我们的浅复制和深复制。

如果Obj类里面只有基本数据类型的话,我们只需要进行浅复制,若有引用类型的话,亦需进行深复制。

浅复制和深复制的主要区别就在于,被复制对象的 引用类型对象和复制对象的引用类型对象仍然是同一个对象;而深复制实现了不仅基本类型,而且引用类型都不再是原来的变量或者对象。

那么如何进行浅复制和深复制?

1.实现clone()的类首先要实现cloneable接口

2.重写clone()方法

3.在clone()中调用super.clone()方法

4.把浅复制的引用只想原型对象新的克隆体。

5.完成浅复制后,对对象或者能够引用类型的属性也调用clone()方法完成深复制。


demo如下:

import java.util.Date;//java 中clone方法,深复制与浅复制public class clone {public static void main(String args[]) {Obj a=new Obj();Obj b=(Obj)a.clone();System.out.println(a.getName());a.setName("tom");System.out.println(b.getName());int i=1;int j=i;i=i+11;System.out.println(j);}}class Obj implements Cloneable{//实现cloneableprivate int age;private String name;private Date birth=new Date();public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Date getBirth() {return birth;}public void setBirth(Date birth) {this.birth = birth;}public Object clone() {//重写clone()Obj o=null;try {o=(Obj)super.clone();//先对基本类型进行浅复制:     调用父类的super(),注意强制转换,} catch (CloneNotSupportedException e) {// TODO Auto-generated catch blocke.printStackTrace();}o.birth=(Date)this.getBirth().clone();//然后对非基本类型实现深复制,对每一个对象调用clone()方法return o;}}


原创粉丝点击