首页 » PHP教程 » phpclone重写办法技巧_识破表象深入本质Object之clone方法浅拷贝深度拷贝事理

phpclone重写办法技巧_识破表象深入本质Object之clone方法浅拷贝深度拷贝事理

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

Object之clone()方法:

浸染:

phpclone重写办法技巧_识破表象深入本质Object之clone方法浅拷贝深度拷贝事理

1、是Java中用于创建工具副本的方法,通过创建一个新工具,将当前工具的状态复制新工具中来。
JDK中Object的clone()是native方法,由虚拟机实现,返回一个Object类型的新实例,是当前工具的浅拷贝

phpclone重写办法技巧_识破表象深入本质Object之clone方法浅拷贝深度拷贝事理
(图片来自网络侵删)

把稳点:浅拷贝与深度拷贝

1、浅拷贝意味着新工具和原始工具的非基本类型字段都指向同一个内存地址。
如果原始工具中包含了对工具的引用,引用在新工具中仍旧是指向原来的工具,而不是创建新的工具。
导致原始工具和克隆工具之间存在隐式的连接,对任一工具的修正都可能影响到另一个工具。
深度拷贝便是为理解决这个引用通报的问题。

如何精确重写clone()方法:

1、须要在子类中覆盖这个方法,并确保实现了Cloneable接口。
供应对克隆过程的完备掌握,并确保工具的所有属性都被复制。
如果没有实现Cloneable接口,调用clone()方法将会抛出CloneNotSupportedException,如果工具中有引用工具,在重写clone方法里面的对引用工具做深度拷贝。

值通报和引用通报:

1、值通报:基本数据类型参数通报都是值通报。
将一个变量作为参数通报给方法时,实际上通报的是这个变量的副本(值)

public void updateValue(int value) {

value = 10;

// 改变的是方法内的副本,原始变量不变

}

public static void main(String[] args) {

int originalValue = 5;

updateValue(originalValue);

System.out.println(originalValue);

// 输出仍旧是 5

}

originalValue的值在方法调用后没有改变,updateValue方法操作的是originalValue的一个副本。

2、引用通报:对付工具引用,通报的是引用的副本,但操作的是原始工具。
这种机制被称为伪引用通报。
所以为什么须要深度拷贝。

public void updateObject(MyObject obj) {

obj.someField = "New Value";

// 改变的是工具的属性,原始工具也被改变

}

public static void main(String[] args) {

MyObject originalObject = new MyObject();

updateObject(originalObject);

System.out.println(originalObject.someField);

}

只管originalObject是一个引用,updateObject方法改变了工具originalObject的属性。
方法吸收的是工具引用的副本,但副本指向的是同一个工具。

3、见图3:浅拷贝与深度拷贝的差异,如须要源码请留言。

package org.example;import lombok.Data;@Datapublic class MyObject implements Cloneable { private int value; private SomeOtherObject1 someOtherObject1 ; public MyObject(SomeOtherObject1 someOtherObject1){ this.someOtherObject1 = someOtherObject1; } // 布局函数、getter和setter省略 //浅拷贝 / @Override public MyObject clone() throws CloneNotSupportedException { MyObject clonedObject = (MyObject) super.clone(); return clonedObject; }/ //深度拷贝 @Override public MyObject clone() throws CloneNotSupportedException { MyObject clonedObject = (MyObject) super.clone(); // 如果reference也是一个须要克隆的工具,这里须要进行深度拷贝,工具要进行深度拷贝 clonedObject.someOtherObject1 = someOtherObject1.clone(); return clonedObject; } public static void main(String[] args) throws CloneNotSupportedException { SomeOtherObject1 someOtherObject11 = new SomeOtherObject1("123123123"); MyObject myObject = new MyObject(someOtherObject11); System.out.println(someOtherObject11.getName()); MyObject copy = myObject.clone(); copy.someOtherObject1.setName("234234234"); System.out.println(someOtherObject11.getName()); }}

package org.example;import lombok.Data;@Datapublic class SomeOtherObject1 implements Cloneable{ private String name ; public SomeOtherObject1(String name){ this.name = "laowu"; } @Override public SomeOtherObject1 clone() throws CloneNotSupportedException { return (SomeOtherObject1) super.clone(); }}

相关文章

佳境大数据,赋能新时代智慧城市建设

随着科技的飞速发展,大数据已成为推动社会发展的重要力量。在我国,智慧城市建设已成为国家战略,而大数据则为智慧城市建设提供了强有力的...

PHP教程 2024-12-15 阅读0 评论0

介绍盘币盈利之路,投资与交易的艺术

随着数字货币市场的蓬勃发展,越来越多的人开始关注盘币投资与交易。盘币,顾名思义,指的是在数字货币市场中具有一定流通性、交易活跃度的...

PHP教程 2024-12-15 阅读0 评论0

介绍怪兽大数据,数据时代的“怪兽”力量

随着互联网的飞速发展,大数据已经渗透到我们生活的方方面面。而在众多数据中,有一类数据因其独特性和价值而被冠以“怪兽”之名——怪兽大...

PHP教程 2024-12-15 阅读0 评论0