浅拷贝与深拷贝

.引用拷贝

A a=new A();
A b=a;

以上是 引用拷贝 a和b 同时引用了堆内存上的new A()操作;

.对象拷贝

对对象进行拷贝,拷贝完的对象不会同时引用一个堆内存上的数据。若A是源对象 B是拷贝后的对象 则A==B操作返回fales

…浅拷贝

对象本身属性使用对象拷贝,对象引用的属性使用引用拷贝

注意:本实验存在两个对象EmailEntity 和 JSPClassEntity 对象 其中EmailEntity 引用了 JSPClassEntity 对象。

实现方式:实体对象实现Cloneable接口重写clone方法即可

    public static void main(String[] args) throws Exception {
        File file = new File("aac");
        EmailEntity emailEntity = new EmailEntity(1,"my email","this is email",file);
        JSPClassEntity entity = new JSPClassEntity();
        entity.setCourseName("ui");
        emailEntity.setJspClassEntity(entity);


        //深拷贝:
//        FileOutputStream fileOutputStream = new FileOutputStream("D:\\heiheiS");
//
//        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
//
//        objectOutputStream.writeObject(emailEntity);
//
//        FileInputStream fileInputStream = new FileInputStream("D:\\heiheiS");
//
//        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        //EmailEntity o = (EmailEntity)objectInputStream.readObject();
        
        // 浅拷贝
        EmailEntity o =(EmailEntity) emailEntity.clone();

        emailEntity.setId(5);

        entity.setCourseName("one");


        System.out.println(emailEntity==o);

        System.out.println(emailEntity.toString());

        System.out.println(o.toString());
    }

结果:

false
EmailEntity{id=5, title='my email', body='this is email', file=aac, jspClassEntity=JSPClassEntity{courseName='one', oneStudent='null', twoStudent='null', threeStudent='null'}}
EmailEntity{id=1, title='my email', body='this is email', file=aac, jspClassEntity=JSPClassEntity{courseName='one', oneStudent='null', twoStudent='null', threeStudent='null'}}
…深拷贝

对象本身属性使用对象拷贝,对象引用的属性也使用对象拷贝

实现方式:对象序列化对象(方式多种也可以用实体对象实现Cloneable接口自己重写clone方法 ,为了看出效果我直接用的序列化)

public static void main(String[] args) throws Exception {
        File file = new File("aac");
        EmailEntity emailEntity = new EmailEntity(1,"my email","this is email",file);
        JSPClassEntity entity = new JSPClassEntity();
        entity.setCourseName("ui");
        emailEntity.setJspClassEntity(entity);


        //深拷贝:
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\heiheiS");

        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(emailEntity);

        FileInputStream fileInputStream = new FileInputStream("D:\\heiheiS");

        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        EmailEntity o = (EmailEntity)objectInputStream.readObject();

        // 浅拷贝
        //EmailEntity o =(EmailEntity) emailEntity.clone();

        emailEntity.setId(5);

        entity.setCourseName("one");


        System.out.println(emailEntity==o);

        System.out.println(emailEntity.toString());

        System.out.println(o.toString());




    }

结果:

false
EmailEntity{id=5, title='my email', body='this is email', file=aac, jspClassEntity=JSPClassEntity{courseName='one', oneStudent='null', twoStudent='null', threeStudent='null'}}
EmailEntity{id=1, title='my email', body='this is email', file=aac, jspClassEntity=JSPClassEntity{courseName='ui', oneStudent='null', twoStudent='null', threeStudent='null'}}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值