JAVA浅克隆与深克隆简述

浅克隆与深克隆简述(如有问题烦请各位同学指正):

浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。

1:浅克隆

	浅克隆只需要实现两个接口:Serializable   Cloneable ,然后实现 Cloneable 接口的  clone   方法  就可以实现浅克隆了。代码参考如下:
import java.io.Serializable;

public class User implements Serializable,Cloneable {
    private String name;

    private Integer age;

    public static  String JINGTAI  = "55555";

    public User(String name, Integer age) {
                super();
                this.name = name;
                this.age = age;
           }
    public String getName() {
         return name;
     }

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

    public Integer getAge() {
         return age;
     }

     public void setAge(Integer age) {
         this.age = age;
     }
    @Override
     public Object clone() {
         Object o = null;
        try {
                 //Object中的clone()识别出你要复制的是哪一个对象
                 o = (User) super.clone();
             } catch (CloneNotSupportedException e) {
                 System.out.println(e.toString());
             }
        return o;
    }
}
直接调用父类的clone()方法即可实现浅克隆

2:深克隆

深克隆是通过ByteArrayOutputStream,ObjectOutputStream,ByteArrayInputStream,ObjectInputStream这些IIO操作实现的,Java的深克隆其实就是反序列化的一个过程
代码如下:

import java.io.*;

public class Teacher implements Serializable,Cloneable {
    private String name;
    private int age;

    public Teacher(String name, int age){
        this.name = name;
        this.age = age;
    }

    public Object deepClone() throws IOException, ClassNotFoundException {
        //序列化
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        //反序列化
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3:测试上面的结论

测试代码

import java.io.IOException;

public class CloneDemo {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User user  = new User("222",20);
        User user1 = (User) user.clone();
        System.out.println("浅克隆两个对象是否地址相同:"+(user.getName()==user1.getName()));

        Teacher teacher = new Teacher("222",20);
        Teacher teacher1 = (Teacher) teacher.deepClone();
        System.out.println("深克隆两个对象是否地址相同:"+(teacher.getName()==teacher1.getName()));
    }

}

输入结果如下:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值