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

把稳点:浅拷贝与深度拷贝
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(); }}