zoukankan      html  css  js  c++  java
  • Java深拷贝和浅拷贝的区别

    浅拷贝

    被复制的对象的所有的变量都与原对象有相同的值,而所有的引用对象仍然指向原来的对象。换言之,浅拷贝 不复制引用对象。

    复制代码
     1 class Experience {
     2     private String skill;
     3     public void setSkill(String skill){
     4         this.skill = skill;
     5     }
     6     public void setExperience(String skill){
     7         this.skill = skill;
     8     }
     9 
    10     @Override
    11     public String toString() {
    12         return skill;
    13     }
    14 }
    15 
    16 public class CloneTest implements Cloneable{
    17 
    18     private int age ;
    19     private Experience experience;   
    20 
    21     public CloneTest(){
    22         this.age = 10;
    23         this.experience = new Experience();
    24     }
    25     public Experience getExperience() {
    26         return experience;
    27     }
    28     public void setExperience(String skill){
    29         experience.setExperience(skill);
    30     }
    31     public void show(){
    32         System.out.println(experience.toString());
    33     }
    34     public int getAge() {
    35         return age;
    36     }
    37     @Override
    38     protected Object clone() throws CloneNotSupportedException {
    39         return (CloneTest) super.clone();
    40     }
    41 }
    42 //测试类
    43 class MianTest{
    44 
    45     public static void main(String[] args) throws CloneNotSupportedException {
    46         CloneTest test = new CloneTest();
    47         test.setExperience("我是小明,我精通Java,C++的复制粘贴");
    48         test.show();
    49         CloneTest cloneTest = (CloneTest) test.clone();
    50         cloneTest.show();
    51         cloneTest.setExperience("我是小明的副本,我精通Java,C++");
    52         cloneTest.show();
    53         test.show();
    54         System.out.println(cloneTest.getAge());
    55     }
    56 }
    复制代码

    输出的结果:

    我是小明,我精通Java,C++的复制粘贴
    我是小明,我精通Java,C++的复制粘贴
    我是小明的副本,我精通Java,C++
    我是小明的副本,我精通Java,C++
    10

    从结果中不难看出,拷贝的副本改变了Experience的skill属性,原类中的skill属性打印出来也是修改后的结果,说明引用 类型的拷贝没有将对象拷贝,引用的指向还是原类中的指向

    深拷贝

    除了被复制的对象的所有变量都有原来对象的值之外,还把引用对象也指向了被复制的新对象

    复制代码
     1 class Experience implements Cloneable{
     2     private String skill;
     3     public void setSkill(String skill){
     4         this.skill = skill;
     5     }
     6     public void setExperience(String skill){
     7         this.skill = skill;
     8     }
     9 
    10     @Override
    11     public String toString() {
    12         return skill;
    13     }
    14 
    15     @Override
    16     protected Object clone() throws CloneNotSupportedException {
    17         return super.clone();
    18     }
    19 }
    20 
    21 public class CloneTest implements Cloneable{
    22 
    23     private int age ;
    24     private Experience experience;
    25 
    26     public CloneTest(){
    27         this.age = 10;
    28         this.experience = new Experience();
    29     }
    30     public Experience getExperience() {
    31         return experience;
    32     }
    33     public void setExperience(String skill){
    34         experience.setExperience(skill);
    35     }
    36     public void show(){
    37         System.out.println(experience.toString());
    38     }
    39     public int getAge() {
    40         return age;
    41     }
    42     @Override
    43     protected Object clone() throws CloneNotSupportedException {
    44         CloneTest o = (CloneTest) super.clone();
    45         o.experience = (Experience) o.getExperience().clone();
    46         return o;
    47     }
    48 }
    49 class MianTest{
    50 
    51     public static void main(String[] args) throws CloneNotSupportedException {
    52         CloneTest test = new CloneTest();
    53         test.setExperience("我是小明,我精通Java,C++的复制粘贴");
    54         test.show();
    55         CloneTest cloneTest = (CloneTest) test.clone();
    56         cloneTest.show();
    57         cloneTest.setExperience("我是小明的副本,我精通Java,C++");
    58         cloneTest.show();
    59         test.show();
    60         System.out.println(cloneTest.getAge());
    61     }
    62 }
    复制代码

    输出的结果:

    我是小明,我精通Java,C++的复制粘贴
    我是小明,我精通Java,C++的复制粘贴
    我是小明的副本,我精通Java,C++
    我是小明,我精通Java,C++的复制粘贴
    10

    可以看出和第一次的结果不同了。

    o.experience =(Experience) o.getExperience().clone();

    加了这句之后效果不同的。说明实现了深拷贝,原引用对象也复制过来了

     

     

     

     

     

  • 相关阅读:
    使用 VBRichClient 库
    提取文件夹目录的办法
    编程语言转换
    解决linux服务器上matplotlib中文显示乱码问题
    动态规划 53:Maximum Subarray,152:Maximum Subarray,266. Palindrome Permutation 回文全排列
    动态规划:494,576
    ResourceExhaustedError 解决方案
    周赛138场
    leetcode 115
    leetcode 372
  • 原文地址:https://www.cnblogs.com/651434092qq/p/12120179.html
Copyright © 2011-2022 走看看