zoukankan      html  css  js  c++  java
  • JAVA深复制(深克隆)与浅复制(浅克隆)

    浅复制与深复制概念

    1.浅复制(浅克隆)

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

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

    Java的clone()方法

    1.clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足

    2.对任何的对象x,都有x.clone() !=x  因为克隆对象与原对象不是同一个对象

    3.对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样

    4.如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立

    Java中对象的克隆

    1.为了获取对象的一份拷贝,我们可以利用Object类的clone()方法

    2.在派生类中覆盖基类的clone()方法,并声明为public

    3.在派生类的clone()方法中,调用super.clone()

    4.在派生类中实现Cloneable接口

    实例代码:

     1 public class User implements Cloneable {
     2 
     3     private String name;
     4     private Integer age;
     5 
     6     
     7     public User(String name, Integer age) {
     8         super();
     9         this.name = name;
    10         this.age = age;
    11     }
    12 
    13     public String getName() {
    14         return name;
    15     }
    16 
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20 
    21     public Integer getAge() {
    22         return age;
    23     }
    24 
    25     public void setAge(Integer age) {
    26         this.age = age;
    27     }
    28 
    29     @Override
    30     public Object clone() {
    31         Object o = null;
    32         try {
    33             //Object中的clone()识别出你要复制的是哪一个对象
    34             o = (User) super.clone();       
    35         } catch (CloneNotSupportedException e) {
    36             System.out.println(e.toString());
    37         }
    38         return o;
    39     }
    40     
    41     
    42 }
    43 
    44 
    45 public class Demo06 {
    46 
    47     public static void main(String[] args) {
    48         
    49         User u = new User("xiaoming",20);
    50         User u2 = (User)u.clone();
    51         u2.setName("lisi");
    52         u2.setAge(30);
    53         System.out.println("name="+u.getName()+","+"age="+u.getAge());
    54         System.out.println("name="+u2.getName()+","+"age="+u2.getAge());
    55     }
    57 }72 
    73 输出结果:
    74 name=xiaoming,age=20
    75 name=lisi,age=30
    76 
    77 说明:
    78 为什么我们在派生类中覆盖Object的clone()方法时,一定要调用super.clone()呢?在运行时刻,Object中的clone()识别出你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。

     浅克隆

     1 public class Professor {
     2 
     3     private String name;
     4     private Integer age;
     5     
     6     public Professor(String name, Integer age) {
     7         super();
     8         this.name = name;
     9         this.age = age;
    10     }
    11     public String getName() {
    12         return name;
    13     }
    14     public void setName(String name) {
    15         this.name = name;
    16     }
    17     public Integer getAge() {
    18         return age;
    19     }
    20     public void setAge(Integer age) {
    21         this.age = age;
    22     }
    23 }
    24 
    25 public class Student implements Cloneable {
    26 
    27     private String name;
    28     private Integer age;
    29     
    30     //引用
    31     private Professor professor;
    32 
    33     public Student(String name, Integer age, Professor professor) {
    34         super();
    35         this.name = name;
    36         this.age = age;
    37         this.professor = professor;
    38     }
    39 
    40     public String getName() {
    41         return name;
    42     }
    43 
    44     public void setName(String name) {
    45         this.name = name;
    46     }
    47 
    48     public Integer getAge() {
    49         return age;
    50     }
    51 
    52     public void setAge(Integer age) {
    53         this.age = age;
    54     }
    55 
    56     public Professor getProfessor() {
    57         return professor;
    58     }
    59 
    60     public void setProfessor(Professor professor) {
    61         this.professor = professor;
    62     }
    63     
    64     @Override
    65     public Object clone() {
    66         Object o = null;
    67         try {
    68             //Object中的clone()识别出你要复制的是哪一个对象
    69             o = (Student) super.clone();       
    70         } catch (CloneNotSupportedException e) {
    71             System.out.println(e.toString());
    72         }
    73         return o;
    74     }
    75 }
    76 
    77 测试
    78 public class Demo07 {
    79 
    80     public static void main(String[] args) {
    81         
    82         Professor p = new Professor("wangwu", 50);
    83         Student s1 = new Student("xiaoming",20,p);
    84         Student s2 = (Student) s1.clone();
    85         s2.getProfessor().setName("wangxiaowu");
    86         s2.getProfessor().setAge(30);
    87         System.out.println("name="+s1.getProfessor().getName()+","+"age="+s1.getProfessor().getAge());
    88         System.out.println("name="+s2.getProfessor().getName()+","+"age="+s2.getProfessor().getAge());
    89     }
    90 
    91 }
    92 
    93 输出结果:
    94 name=wangxiaowu,age=30
    95 name=wangxiaowu,age=30
    View Code

    深克隆

      1 public class Professor implements Cloneable {
      2 
      3     private String name;
      4     private Integer age;
      5 
      6     public Professor(String name, Integer age) {
      7         this.name = name;
      8         this.age = age;
      9     }
     10 
     11     public String getName() {
     12         return name;
     13     }
     14 
     15     public void setName(String name) {
     16         this.name = name;
     17     }
     18 
     19     public Integer getAge() {
     20         return age;
     21     }
     22 
     23     public void setAge(Integer age) {
     24         this.age = age;
     25     }
     26 
     27     public Object clone() {
     28 
     29         Object o = null;
     30         try {
     31             o = super.clone();
     32         } catch (CloneNotSupportedException e) {
     33             System.out.println(e.toString());
     34         }
     35         return o;
     36     }
     37 
     38 }
     39 
     40 Student类:
     41 public class Student implements Cloneable {
     42 
     43     private String name;
     44     private Integer age;
     45     private Professor professor;
     46 
     47     public Student(String name, Integer age, Professor professor) {
     48         this.name = name;
     49         this.age = age;
     50         this.professor = professor;
     51     }
     52 
     53     public String getName() {
     54         return name;
     55     }
     56 
     57     public void setName(String name) {
     58         this.name = name;
     59     }
     60 
     61     public Integer getAge() {
     62         return age;
     63     }
     64 
     65     public void setAge(Integer age) {
     66         this.age = age;
     67     }
     68 
     69     public Professor getProfessor() {
     70         return professor;
     71     }
     72 
     73     public void setProfessor(Professor professor) {
     74         this.professor = professor;
     75     }
     76 
     77     public Object clone() {
     78 
     79         Student o = null;
     80         try {
     81             o = (Student) super.clone();
     82         } catch (CloneNotSupportedException e) {
     83             System.out.println(e.toString());
     84         }
     85         o.professor = (Professor) professor.clone();
     86         return o;
     87     }
     88 }
     89 
     90 测试:
     91 public class Demo01 {
     92 
     93     public static void main(String[] args) {
     94 
     95         Professor p = new Professor("wangwu", 50);
     96         Student s1 = new Student("xiaoming", 20, p);
     97         Student s2 = (Student) s1.clone();
     98         s2.getProfessor().setName("xiaowangwu");
     99         s2.getProfessor().setAge(40);
    100         System.out.println("name=" + s1.getProfessor().getName()
    101                 + "," + "age=" + s1.getProfessor().getAge());
    102         System.out.println("name=" + s2.getProfessor().getName()
    103                 + "," + "age=" + s2.getProfessor().getAge());
    104     }
    105 }
    106 
    107 输出结果:
    108 
    109 name=wangwu,age=50
    110 name=xiaowangwu,age=40
  • 相关阅读:
    ios界面布局整理
    android ProGuard 代码混淆实现
    mac版 android破解软件下载安装
    在unix系统下的 .o文件 .a文件 .so文件说明和相互关系
    android中的广播接收实现总结
    用java的jdk 生成android 的jni接口文档
    Android 自定义Application
    android项目中配置NDK自动编译生成so文件
    创建android Notification
    (ios) nsnotification总结
  • 原文地址:https://www.cnblogs.com/qlwang/p/7889802.html
Copyright © 2011-2022 走看看