对java对象的地址引用及值引用

本文详细解释了Java中对象克隆的概念、原理和两种主要方式:浅克隆和深度克隆。浅克隆仅复制对象的引用,而深度克隆则递归复制对象的所有引用属性,确保新生成的对象完全独立于原始对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当将一个list的元素分别保存到另外五个list中后,对5个list中的对象做值修改,其实这5个list的值会同时改变,所以当需要将一个list中的元素放到另外的list或其他集合中时,不能直接使用list 的get方法以及put方法,如果不需要对元素的进行内容的修改也可以,否则需要另外新建一个对象,并将原来的对象的内容赋值给新的对象。这将使用大量的get以及set方法,另外有两种办法可以直接对原有的对象进行克隆,可以避免大量的get以及set方法,生成一个原对象的副本。这时这两个对象的内容在内存地址是不一样的。

当java 的不同方法获取同一个对象的地址引用,那任一方法都可以对这个对象内部进行修改,会对其他的引用造成影响。Java中所有的对象都是保存在堆中

克隆有两种办法,一种是对pojo实现Cloneable接口

public Object clone(){

   A  a  = null;

   try{

            a = (A) super.clone();

           }catch(Exception e){

                               }

    return a;

}


当元素的属性包含了其他的vo 或数组时,上面的clone就对这种字段仍然是引用复制,也就是指这些字段的值都是同一个内存地址的。这时需要深度克隆,其实也就是在重载clone方法时,需要针对这些字段进行克隆


public  Object  clone(){

          A   a  = null;

           try{

                      a = (A)super.clone();

                       a.name = (String[])name.clone();           

                           }catch(Exception e){

                                                                    }

}



另外一种克隆是将对象序列化,使用输出流以及输入流来进行克隆,这种克隆需要将对象以及内部引用的其他对象都进行序列化。


public Object deepclone(){

   Object obj = null;

   try{

           ByteArrayOutputStream byout = new ByteArrayOutputStream();

           ObjectOutputStream obs = new ObjectOutputStream(byout);

            obs.writeObject(this);

            obs.close();

          ByteArrayInputStream byin  = new ByteArrayInputStream(byout.toByteArray());

          Object InputStream ibs = new ObjectInputStream(byin);

           obj = ibs.readOjbect();

           ibs.close();

                }catch(Exception e){

                              }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值