一、java克隆的作用
存在一个对象A,此对象中已经有一些初始值,现在我们需要对象 和对象A有同样的初始值,如果我们使用A b = a的方式则改变b引用指向的对象的时候 a的值也会改变因为他们指向同一个对象,而如果使用A b = new A()的方式,此时就不能保证和a对象有相同的初始值。所以此时我们需要使用clone()方法
二、深克隆和浅克隆的区别?
当一个对象中仅仅有String、int等这些基本类型的变量的时候,使用浅克隆没有问题,但是当一个对象存在引用类型的变量的时候,就需要使用深克隆了,因为深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象
三、代码示例
浅拷贝:
@Data
public class User implements Cloneable{
private String name;
private Address address;
public User(String name){
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return (User)super.clone();
}
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User("张三");
user.setAddress(new Address("上海市"));
User user2 = (User) user.clone();
user2.setName("李四");
user2.getAddress().setCity("北京");
System.out.println("user:"+user+",user2:"+user2);
}
}
user:User(name=张三, address=Address(city=北京)),user2:User(name=李四, address=Address(city=北京))
可以看到,当我们修改了user2中的地址的时候,user的地址也相应发生了变化
深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
User user = (User) super.clone();
user.address = (Address) address.clone();
return user;
}
user:User(name=张三, address=Address(city=上海市)),user2:User(name=李四, address=Address(city=北京))
可以看到,使用了深拷贝之后,两个引用之间对变量进行修改值就不会互相影响了
本文介绍了Java中对象克隆的重要作用,通过实例展示了浅拷贝和深拷贝的区别。在浅拷贝中,修改拷贝后的对象会影响到原始对象,而深拷贝则确保了对象的独立性。文章通过代码示例解释了如何实现深拷贝以避免引用对象的变化影响原始对象的状态。
&spm=1001.2101.3001.5002&articleId=118971657&d=1&t=3&u=c10ff422eb0b425db32c3f14c9863dc6)
315

被折叠的 条评论
为什么被折叠?



