Hefery 的个人网站

Hefery's Personal Website

Contact:hefery@126.com
  menu
73 文章
0 浏览
1 当前访客
ღゝ◡╹)ノ❤️

Java基础—拷贝对象

clone对象简介

需求:有一个对象 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中值即,A 与 B 是两个独立的对象,但 B 的初始值是由A对象确定的。在 Java 语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现 clone() 是其中最简单,也是最高效的手段

new 对象和 clone对象的区别

  • new 的本意是分配内存。程序执行到new操作符时
    1. 首先去看new操作符后面的类型,根据类型分配内存空间
    2. 分配完内存之后,再调用构造函数,填充对象的各个域,即对象的初始化
    3. 构造方法返回后,对象创建完毕,可把它的引用发布到外部,外部就可使用这个引用操纵这个对象
  • clone:
    1. 第一步和 new 相似,都是分配内存,调用 clone() 时,分配的内存和原对象(即调用 clone 方法的对象)相同
    2. 然后再使用原对象中对应的各个域,填充新对象的域,填充完成之后,clone() 返回,一个新的相同的对象被创建
    3. 同样可以把这个新对象的引用发布到外部

复制对象和复制引用的区别

  • 复制引用:
    Person p = new Person("张三",23);
    Person p1 = p;
    
  • 复制对象:
    Person p = new Person("张三",23);
    Person p1 = (Person) p.clone();
    

深拷贝和浅拷贝

Person 中有两个成员变量,分别是 name 和 age, name 是 String 类型, age 是 int 类型:

  • age 是基本数据类型,那么对它的拷贝没有什么疑议,直接将一个4字节的整数值拷贝过来就行
  • String 类型的 name,它只是一个引用,指向一个真正的 String 对象,那么对它的拷贝有两种方式:
    • 浅拷贝:直接将原对象中的 name 的引用值拷贝给新对象的 name 字段(clone() 执行的是浅拷贝)
    • 根据原 Person 对象中的 name 指向的字符串对象创建一个新的相同的字符串对象,将这个新字符串对象的引用赋给新拷贝的 Person 对象的 name 字段

如何进行深拷贝?

被引用的对象必须也要实现 Cloneable 接口并且实现 clone 方法,并且在 clone() 内部,把该对象引用的其他对象也要 clone 一份


标题:Java基础—拷贝对象
作者:Hefery
地址:http://hefery.icu/articles/2022/02/14/1644833437795.html