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

时间:2025-03-06 17:13:17

当将一个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) ();

           }catch(Exception e){

                               }

    return a;

}


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


public  Object  clone(){

          A   a  = null;

           try{

                      a = (A)();

                       = (String[])();           

                           }catch(Exception e){

                                                                    }

}



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


public Object deepclone(){

   Object obj = null;

   try{

           ByteArrayOutputStream byout = new ByteArrayOutputStream();

           ObjectOutputStream obs = new ObjectOutputStream(byout);

            (this);

            ();

          ByteArrayInputStream byin  = new ByteArrayInputStream(());

          Object InputStream ibs = new ObjectInputStream(byin);

           obj = ();

           ();

                }catch(Exception e){

                              }

}