解析JAVA深度克隆与浅度克隆的区别详解

xinwuliu2008

xinwuliu2008

2016-02-19 09:40

今天图老师小编给大家展示的是解析JAVA深度克隆与浅度克隆的区别详解,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!
在JAVA克隆对象不能简单的使用clone方法,clone方法只是进行浅克隆。请看下方:
深度克隆类:
Java代码
代码如下:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class DepthClone {
    public  final static Object objectCopy(Object oldObj) {
        Object newObj = null;
        try {
            ByteArrayOutputStream bo = new ByteArrayOutputStream();
            ObjectOutputStream oo = new ObjectOutputStream(bo);
            oo.writeObject(oldObj);//源对象
            ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
            ObjectInputStream oi= new ObjectInputStream(bi);
            newObj = oi.readObject();//目标对象
        } catch (IOException e) {
            e.printStackTrace();
        }catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return newObj;
    }
}

浅度克隆类:
Java代码
代码如下:

import java.io.Serializable;
public class SimpleClone implements Cloneable ,Serializable {
    private static final long serialVersionUID = -7552721152118950502L;

    public    String s = null;
    public Object o = null;
    public CloneObject cloneObject = null;

    
    public SimpleClone(CloneObject cloneObject) {
        this.cloneObject = cloneObject;
    }
    public Object clone() {
        SimpleClone newSimpleClone =  null;
        try {
            /* 浅克隆 */
            newSimpleClone = (SimpleClone)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return newSimpleClone;
    }
}

克隆对象:
Java代码
代码如下:

import java.io.Serializable;

public class CloneObject implements Serializable{

    private static final long serialVersionUID = 4332788486669750696L;

    private String name ;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

克隆测试:
Java代码
代码如下:

public class TestClone {

    public static void main(String[] arg) {
        CloneObject obj1 = new CloneObject();
        obj1.setName("cloneOne");
        CloneObject obj2 = new CloneObject();
        obj2.setName("cloneTwo");

        SimpleClone simpleClone1 = new SimpleClone(obj1);
        SimpleClone simpleClone2 = new SimpleClone(obj2);

        simpleClone1.s = "simpleClone1";
        simpleClone1.o = "simpleClone1Object";

        //simpleClone2 = (SimpleClone)simpleClone1.clone();

        simpleClone2 = (SimpleClone)DepthClone.objectCopy(simpleClone1);

        /* 如果是浅克隆, simpleClone1中的cloneObject会随着simpleClone2的cloneObject改变面改变*/
        simpleClone2.cloneObject.setName("cloneThree");

        System.out.println(simpleClone1.cloneObject.getName());
        System.out.println(simpleClone2.cloneObject.getName());
    }

}

展开更多 50%)
分享

猜你喜欢

解析JAVA深度克隆与浅度克隆的区别详解

编程语言 网络编程
解析JAVA深度克隆与浅度克隆的区别详解

深入JAVA对象深度克隆的详解

编程语言 网络编程
深入JAVA对象深度克隆的详解

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

基于序列化存取实现java对象深度克隆的方法详解

编程语言 网络编程
基于序列化存取实现java对象深度克隆的方法详解

Java关于克隆与“冷藏”和“解冻”方法

编程语言 网络编程
Java关于克隆与“冷藏”和“解冻”方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

普通QQ怎么克隆QQ好友 普通QQ克隆QQ好友的方法

电脑网络
普通QQ怎么克隆QQ好友 普通QQ克隆QQ好友的方法

字体对象克隆招法

编程语言 网络编程
字体对象克隆招法

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

基于Java Tomcat和激活MyEclips的深入理解

基于Java Tomcat和激活MyEclips的深入理解

基于jni调用时,jvm报错问题的深入分析

基于jni调用时,jvm报错问题的深入分析
下拉加载更多内容 ↓