引用类型复制-深浅复制

13人阅读 评论(1) 收藏 举报
分类:

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;
   }
查看评论

Mat图像的深浅复制区别

Mat图像的深浅复制区别
  • My_leaf
  • My_leaf
  • 2017-07-23 16:21:32
  • 159

引用类型的深浅复制

MemberwiseClone 方法创建一个浅表副本,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但...
  • flyfener
  • flyfener
  • 2016-12-20 09:06:17
  • 344

深浅拷贝解析

详细分析C++深拷贝与浅拷贝区别,并给出相应的示例程序。
  • u011420067
  • u011420067
  • 2016-09-07 15:39:09
  • 1294

C#值类型、引用类型复制之比较

众所周知,C#复制有深度复制和浅度复制,这里本人添加了它们与赋值运算(=)进行复制的的比较。...
  • ni_zhi
  • ni_zhi
  • 2010-07-25 17:16:00
  • 1155

深浅拷贝的理解

深浅拷贝前提是:是实现NSCopying或者NSMutableCopying协议。 浅拷贝只是复制对象本身,对象的属性和包含的对象不做复制。 深拷贝则对对象本身复制,同是对对象的属性也进行...
  • Andyzzhz
  • Andyzzhz
  • 2014-10-28 10:24:21
  • 655

python 赋值、深浅拷贝、作用域

从python 赋值讲起,图文并茂介绍python中深浅拷贝、作用域等相关问题
  • huruzun
  • huruzun
  • 2016-03-23 17:03:48
  • 1369

JAVA/CPP深浅拷贝

深拷贝浅拷贝C++、JAVA的归纳 C++ c++的深、浅拷贝是针对指针成员变量的。 指针成员不重写拷贝构造函数的话是浅拷贝,深拷贝通过重写拷贝构造函数。 非指针类型都是深拷贝。 J...
  • xiongzaibinggan
  • xiongzaibinggan
  • 2016-10-28 16:01:55
  • 142

js 基本类型和引用类型 变量复制 参数传递

ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是 简单的数据段( Undefined 、 Null 、 Boolean 、 Number 和 Strin...
  • yummy_go
  • yummy_go
  • 2016-01-12 15:46:36
  • 1752

Python中的深浅拷贝详解

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下: 变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝 【变量-对象-引用】 在Python中一切都是对象...
  • Jerry_1126
  • Jerry_1126
  • 2014-12-11 00:08:00
  • 4201

C#代码执行过程;值类型和引用类型;深拷贝和浅拷贝

(一) 1.概述 Main()函数我们有以下几条准则: 1.Main()函数必须封装在类或结构里来提供可执行程序的入口点。C#采用了完全的面向对象的编程方式,C#中不可以有像C++那样的全局函...
  • yoyoshaoye
  • yoyoshaoye
  • 2011-09-08 23:03:19
  • 1698
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 719
    排名: 7万+