没有使用clone时,复制:
第一种:复制对象
。
这样的复制,是把地址给了出去,这样修改一个,都会被修改。
第二种:把每个值都传一遍
缺点:很麻烦。
使用克隆:
浅克隆:会将对象中的引用地址直接拷贝
①,实现克隆接口
②,重写clone方法
修改返回值类型
public class Demo {
public static void main(String[] args) {
User user = new User(1,"tom",new String[]{"睡觉","看书"});
User user1 = null;
try {
user1 = user.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
user1.setName("tomcat");
System.out.println(user);
System.out.println(user1);
}
}
缺陷:只会影响属性是引用数据类型,如果是包装类和String是不会受影响
深克隆:克隆只克隆元素值!“N次克隆”
@Override
public User clone() throws CloneNotSupportedException {
//浅克隆
User cloneUser = (User) super.clone();
//当前对象的爱好(内存地址) ---》 修改引用类型的内存地址:从浅克隆——》深克隆
String[] hobby = this.getHobby();
//复制
String[] copyHobby = Arrays.copyOf(hobby,hobby.length);
//新数组重新赋给对象
cloneUser.setHobby(copyHobby);
return cloneUser;
}
深克隆把克隆对象的所有值都克隆一遍,不会出现地址重复的问题。