JAVA--认识深浅克隆
package sm.exercise3;
public class User {
public static void main(String[] args) {
//数组 引用类型-->值传递 复制的是内存地址值
String[] hobby = {"song", "jump", "rap"};
UserInfo userInfo1 = new UserInfo(1, "鸡你太美", hobby);
UserInfo userInfo2 = userInfo1.clone();
System.out.println("克隆对象userInfo1:" + userInfo1);
System.out.println("克隆后userInfo2:" + userInfo2);
System.out.println("-------------------------------");
userInfo1.getHobby()[0] = "篮球";
System.out.println("克隆对象userInfo1:" + userInfo1);
System.out.println("克隆后userInfo2:" + userInfo2);
}
}
浅克隆可能产生的问题例子:在改变原对象userInfo1的hobby,克隆出的对象userInfo2的hobby也跟着改变
深克隆就能解决这种问题,可以把深克隆理解为复制,粘贴,在一个里面修改东西并不会影响另一个里面的东西

package sm.exercise3;
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
//Cloneable: 标识接口 一个类实现Cloneable 代表这个类能够被克隆对象
public class UserInfo implements Cloneable{
private Integer id;
private String name;
private String[] hobby;
//数组 引用类型-->值传递 复制的是内存地址值
//重写父类Object的克隆方法
@Override
public UserInfo clone() {
UserInfo cloneUser = null;
try {
cloneUser = ( UserInfo)super.clone();//浅克隆
//浅克隆可能会出现修改了对象的某个属性,克隆出来的对象的那个属性可能会跟着改变
//遍历式的处理属性
//深克隆/IO(序列化流)可以解决浅克隆出现的一些问题。下方一行代码
cloneUser.setHobby(hobby.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloneUser;
}
}
浙公网安备 33010602011771号