引用类型复制-深浅复制

1.引用类型在内存中的占位

    public void Test(){
        String str1 = "111";
        String str2;

        str2 = str1;
        System.out.println("str2: " + str2);

        str1 = "222";
        System.out.println("str2: " + str2);
    }

引用类似于指针,如上的程序,输出

str2: 111
str2: 111

是不会改变str2的值的。因为str1,str2都是引用类型,内存中”111”,”222”是两块不同的内存区域,在上述操作中,str2始终指向”111”
所以值没有变。

2.引用类型的数据复制方法

数据复制有两种:

浅复制与深复制
浅复制能够实现基本数据类型的复制,但是对于嵌套的引用类型,依然还是单纯的复制其引用
深复制则是需要在嵌套的引用类型中实现clonenable接口(以clonenable)为例,方能实现嵌套的引用类型复制,所以在引用类型嵌套比较深的时候,使用
clonenable并不是很方便

实现方式有两种:


1.实现clonenable接口,重写clone方法,调用super.clone()通常适用于引用类型嵌套不深的引用类型

@Override  
    public Object clone() {  
        Student stu = null;  
        try{  
            stu = (Student)super.clone();  
        }catch(CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return stu;  
    }  

2.实现serializable接口,通过序列化与反序列化实现深度复制

//Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化] 
    public Outer myclone() {
        Outer outer = null;
        try { // 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
        // 将流序列化成对象
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            outer = (Outer) ois.readObject();
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
      return outer;
   }
阅读更多

没有更多推荐了,返回首页