首页 > 其他分享 >深入理解深浅拷贝

深入理解深浅拷贝

时间:2023-10-24 14:57:21浏览次数:24  
标签:name Teacher age teacher 深入 深浅 拷贝 public

深入理解深、浅拷贝(Java)

​ 以下是个人理解,如有不足,请进行指正和补充,感谢您的阅读。

​ 【参考】https://cloud.tencent.com/developer/article/2158401?areaId=106001

一、什么是拷贝?

​ 拷贝(中文对copy的音译),意思是复制。复制的话,大家应该都很清楚,这里就不作详细解释,意思就是生成一个相同的事物。

​ 常见的拷贝有引用拷贝(赋值拷贝)、浅拷贝、深拷贝。

二、引用拷贝

​ 引用变量的地址,进行复制。可以理解为浅拷贝。

public static void main(String[] args) { 	    
    int a = 1; 		         
    int b = a; 	//引用拷贝,引用a的地址拷贝b。     
}


三、深拷贝和浅拷贝

​ 为了便于理解深拷贝和浅拷贝,这里先声明两个对象Student和Teacher

Student类

class Student implements Cloneable {  
    private String name;
    private int age; 
    private Teacher teacher; 
    public String getName() { 
        return name; 
    } 
    public void setName(String name) {   
        this.name = name;
    }
    public int getAge() {   
        return age; 
    } 
    public void setAge(int age) {   
        this.age = age; 
    } 
    public Teacher getTeacher() {   
        return teacher;
    }
    public void setTeacher(Teacher teacher) {   
        this.teacher = teacher; 
    }
    public Object clone() throws CloneNotSupportedException { 
         return super.clone();     
    } 
}

Teacher类

class Teacher implements Cloneable {     
    private String name;    
    private int age;    
    public Teacher(String name, int age) { 
        this.name = name; this.age = age;   
    }    
    public String getName() {       
        return name;  
    }    
    public void setName(String name) {  
        this.name = name;    
    }   
    public int getAge() {    
        return age;     
    }    
    public void setAge(int age) {    
        this.age = age;   
    }
    public Object clone() throws CloneNotSupportedException { 
     return super.clone(); 
    } 
}

3.1浅拷贝

​ 仅复制当前所拷贝对象的引用地址,利用地址赋值。不包含当前所拷贝对象会引用的其他对象(称之为B),新拷贝的对象会和所拷贝的对象共享B,当B发生变化时可能会引起冲突。

public class QuoteCopy {   
    public static void main(String[] args) { 
		Teacher teacher = new Teacher(); 
        teacher.setName("张三"); 
        teacher.setAge(38);
        Student student1 = new Student(); 
        student1.setName("小明"); 
        student1.setAge(14);
        student1.setTeacher(teacher); 
    
        Student student2 = (Student) student1.clone(); //浅拷贝
        
        System.out.println("拷贝后"); 
        System.out.println(student2.getName()); 
        System.out.println(student2.getAge()); 
        System.out.println(student2.getTeacher().getName()); 
        System.out.println(student2.getTeacher().getAge()); 
        
        // 修改老师的信息 
        System.out.println("修改老师的信息后"); 
        teacher.setName("王五");
        System.out.println("student1的teacher为: " + student1.getTeacher().getName()); 
        System.out.println("student2的teacher为: " + student2.getTeacher().getName()); }
    }
} 

输出结果:

拷贝后
小明 
14
张三 
38 
修改老师的信息后
student1的teacher为:张三
student2的teacher为:张三

3.2深拷贝:

​ 复制当前所拷贝对象所包含的所有引用对象和值,生成新的地址,与原始对象独立,彼此不受影响。深拷贝相比于浅拷贝速度较慢并且花销较大。

public class DeepCopy {  
	public static void main(String[] args) throws CloneNotSupportedException {  
    Teacher teacher = new Teacher(); teacher.setName("张三");
    teacher.setAge(38); 
    Student student1 = new Student(); 
    student1.setName("苏大");
    student1.setAge(18); 
    student1.setTeacher(teacher); 
    Student student2 = (Student) student1.clone(); 
    System.out.println("-------------拷贝后-------------"); 
    System.out.println(student2.getName()); 
    System.out.println(student2.getAge());
    System.out.println(student2.getTeacher().getName()); 
    System.out.println(student2.getTeacher().getAge());
    System.out.println("-------------修改老师的信息后-------------"); 
    // 修改老师的信息 
    teacher.setName("小王");
    System.out.println("student1的teacher为: " + student1.getTeacher().getName()); 
    System.out.println("student2的teacher为: " + student2.getTeacher().getName()); 
    } 
} 
class Teacher implements Cloneable {  
    private String name; private int age; 
    public String getName() {  
   		 return name; 
	}
    public void setName(String name) {  
   		 this.name = name;
    }
    public int getAge() {   
   		 return age; 
    } 
    public void setAge(int age) {  
   		 this.age = age; 
    }
    public Object clone() throws CloneNotSupportedException { 
   		 return super.clone();
    } 
}
class Student implements Cloneable {  
    private String name; private int age; 
    private Teacher teacher;
    public String getName() { 
        return name; 
    } 
    public void setName(String name) {   
        this.name = name;
    } 
    public int getAge() {
        return age; 
    }
    public void setAge(int age) { 
        this.age = age; 
    }
    public Teacher getTeacher() { 
        return teacher; 
    } 
    public void setTeacher(Teacher teacher) {  
        this.teacher = teacher; 
    } 
	public Object clone() throws CloneNotSupportedException { 
        // 浅复制时: 
        // Object object = super.clone();
        // return object;
        // 改为深复制: 
        Student student = (Student) super.clone(); 
        // 本来是浅复制,现在将Teacher对象复制一份并重新set进来 
        student.setTeacher((Teacher) student.getTeacher().clone()); 
        return student; }
}

输出结果:

-------------拷贝后------------- 
苏大
18
张三
38 
-------------修改老师的信息后------------- 
student1的teacher为: 张三
student2的teacher为: 小王

标签:name,Teacher,age,teacher,深入,深浅,拷贝,public
From: https://www.cnblogs.com/nikiL/p/17784770.html

相关文章

  • 一步一图带你深入理解 Linux 物理内存管理
    https://mp.weixin.qq.com/mp/appmsgalbum?__biz=Mzg2MzU3Mjc3Ng==&action=getalbum&album_id=2559805446807928833&scene=173&from_msgid=2247486879&from_itemidx=1&count=3&nolastread=1#wechat_redirect......
  • 给定文件列表,按目录结构拷贝到新目录中
      #!/bin/bash#mycopyTree.sh文件内容如下functionprint_usage(){echo"Usage:${1}<src_list_file><dest_dir>"}functionmycopy_tree(){#输入源文件列表目录src_list_file=${1}#输入目标目录dest_dir=${2}#遍历源文件......
  • 深入解析i++和++i的区别及性能影响
    在我们编写代码时,经常需要对变量进行自增操作。这种情况下,我们通常会用到两种常见的操作符:i++和++i。最近在阅读博客时,我偶然看到了有关i++和++i性能的讨论。之前我一直在使用它们,但从未从性能的角度考虑过,这让我突然产生了兴趣。尽管它们看起来相似,但它们之间存在微妙而重要的区别......
  • FreeRTOS深入教程(任务的引入及栈的作用)
    (文章目录)前言本篇文章开始带大家深入学习FreeRTOS,带大家学习什么是任务,并且深入学习栈的作用。一、任务的引入在FreeRTOS中,任务(Task)是一个基本的执行单元,它代表了一个并行执行的工作单元。FreeRTOS是一个实时操作系统,允许你创建多个任务,每个任务都有自己的代码、堆栈和优......
  • Python:深拷贝与浅拷贝
    python:深拷贝与浅拷贝一、了解几个概念变量:是一个系统表的元素,拥有指向对象的连接空间对象:被分配的一块内存,存储所代表的值引用:是自动形成的从变量到对象的指针类型:属于对象,而非变量不可变对象:一旦创建就不可修改的对象(值内存地址固定后不可以再修改其值),包括字符......
  • [转]setTimeout 和 setInterval 的定时时间深入研究
    原文地址:setTimeout和setInterval的定时时间深入研究-知乎setInterval() -间隔指定的毫秒数不停地执行指定的代码(一直执行)。setTimeout() -在指定的毫秒数后执行指定代码(只执行一次)。使用setInterVal:functiondoStuff(){//此处为需要执行一段时间T......
  • Java基础 文件拷贝的基本代码
    FileInputStreamfis=newFileInputStream("E:\\Java基础资料\\a.txt");FileOutputStreamfos=newFileOutputStream("E:\\Java基础资料\\b.txt");while(true){intb=fis.read();if(b==-1)break;fos.write(b);}fos.close......
  • 什么是美颜SDK?深入了解直播实时美颜SDK
    美颜已经成为了现代社交媒体和直播应用中的重要元素,它使用户能够在拍摄自拍照片或进行直播时改善其外貌特征。美颜技术的普及离不开美颜SDK(软件开发工具包),特别是在直播应用中,直播实时美颜SDK正变得越来越流行。在本文中,我们将深入了解美颜SDK是什么,以及为什么它在直播领域如此重要......
  • idea或者goland输出拷贝问题
    比如你拷贝一串很长的base字符串或者是json串,你会把\n也拷贝出来,这时候就很头疼,有2种解决方案,1是直接写文件,然后文件里copy出来2是借助vim,windows上面是gvim,查找\n,就能把隐藏的\n查出来,也算是一个小tips。......
  • 零拷贝
    目录零拷贝传统拷贝mmap(内存地址映射)+writekafka生态系统组成sendfilesendfile+DMAgathercopysplice+DMAcopy零拷贝传统拷贝read:当使用read调用来读取数据,此时会将用户态转化为内核态CPU对DMA控制器发起一个调用命令DMA将数据从硬盘拷贝到内核缓冲区中,拷贝完后......