zoukankan      html  css  js  c++  java
  • java中的浅拷贝和深拷贝

    复制

      将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。

    1.直接赋值

      在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化时,a2里面的成员变量也会跟着变化。

    2.浅复制(复制引用但不复制引用的对象)

     浅复制,又称为浅拷贝。创建一个新对象,然后将当前对象非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段时引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。

    复制代码
     1 class Resume implements Cloneable{ 
     2      public Object clone() { 
     3          try { 
     4              return (Resume)super.clone(); 
     5          } catch (Exception e) { 
     6              e.printStackTrace(); 
     7          return null; 
     8          } 
     9      } 
    10 } 
    复制代码

    3.深复制(复制对象和其引用对象)

      又称深拷贝,不仅复制对象本身,而且复制对象包含的引用指向的所有对象。

    复制代码
     1 class Student implements Cloneable {
     2          String name;
     3          int age;
     4          Professor p;
     5      Student(String name, int age, Professor p) {
     6          this.name = name;
     7          this.age = age;
     8          this.p = p;
     9      }
    10      public Object clone() {
    11          Student o = null;
    12          try {
    13              o = (Student) super.clone();
    14          } catch (CloneNotSupportedException e) {
    15              System.out.println(e.toString());
    16          }
    17      o.p = (Professor) p.clone();
    18      return o;
    19      }
    20 }
    复制代码

    使用clone()方法克隆一个对象的步骤:

      1)被克隆的类要实现Cloneable接口。

      2)被克隆的类要重写clone()方法。

      那么在编程时,如何选择使用哪种复制方式呢?首先,检查类有无非基本类型(即对象)的数据成员。若没有,则返回super.clone()即可。若有,确保类中包含的所有非基本类型的成员变量都实现了深复制。

    引申:浅复制与深复制的区别?

      浅复制(Shallow Clone):被复制的对象的所有变量都含有与原来对象相同的值,而所有其他对象的引用仍然指向原来的对象。换而言之,浅复制仅仅复制所考虑的对象,而不复制它引用的对象。

      深复制(Deep Clone):被复制对象的所有变量都含有与原来对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制的新对象,而不是原有的那些被引用的对象。换而言之,深复制把复制的对象所引用的对象都复制了一遍。

    扩展:

      原型模式主要用于对象的复制,实现了接口(实现Cloneable接口),重写一个方法(重写Object类中的clone()方法),即完成了原型模式。

      原型模式中的拷贝分为“浅拷贝”和“深拷贝”:

        浅拷贝:对值类型的成员变量进行值的复制,对引用类型得成员变量只复制引用,不复制引用的对象。

        深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制。

      (Object类的clone方法只会拷贝对象中的基本数据类型的值,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。)

  • 相关阅读:
    delegate
    URL、Session、Cookies、Server.Transfer、Application和跨页面传送,利弊比较
    C#中页面之间传值传参的六种方法
    Java学习之路:2、Mysql 链接与查询
    Java学习之路:1、HelloWorld
    Memcache 分布式解决方案 之 : 普通 Hash 分布
    每日一记:搭建Memcached + php 缓存系统
    四、记一次失败的 CAS 搭建 之 结果总是那么伤(客户端)
    三、记一次失败的 CAS 搭建 之 服务端配置
    二、记一次失败的 CAS 搭建 之 证书配置
  • 原文地址:https://www.cnblogs.com/jianwei-dai/p/11970268.html
Copyright © 2011-2022 走看看