说到克隆,其实是个比较简单的概念,跟现实生活正的克隆一样,复制一个一模一样的对象出来。clone()这个方法是从Object继承下来的,一个对象要实现克隆,需要实现一个叫做Cloneable的接口,这个接口没有什么方法,和Comparable接口差不多,仅仅是起一个标志作用,实现了这个接口你就能实现克隆操作。

  这里有两个概念,深度克隆和浅度克隆,这东西虽然平常不怎么用,但是了解一下还是有必要的。Object中的克隆方法是浅度克隆,JDK规定了克隆需要满足的一些条件,简要总结一下就是:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。简单画个图:

浅度克隆只是对当前对象进行克隆,  深度克隆是对当前对象和当前对象内的所用引用类型进行克隆

克隆的本质是将引用类型进行复制使其地址发生改变,后面对该对象进行操作时不会对其克隆出来的对象进行改变

    class User implements Cloneable {
String name;
String password;
String[] arrString;

public User(String name, String password, String[] arrString) {
this.name = name;
this.password = password;
this.arrString = arrString;
}

@Override
protected Object clone() {
User user = null;
try {
user = (User) super.clone();
//user.arrString = arrString.clone()

//浅度克隆只是对当前对象进行克隆,  深度克隆是对当前对象和当前对象内的所用引用类型进行克隆
return user;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}

public class Test {
public static void main(String[] args) {
String[] arrFavor = {“one”, “two”};
User user = new User(“Jerry”, “123456”, arrFavor);
User p = (User) user.clone();
System.out.println(p.name);
System.out.println(p.password);
p.name = “feige”;
p.password = “666666”;
p.arrString[0] = “three”;
for (String favor : p.arrString) {
System.out.print(favor + ” “);
}
System.out.println();
for (String favor : user.arrString) {
System.out.print(favor + ” “);
}
System.out.println();
}
}

 

版权声明:本文为itfeige原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/itfeige/p/10095359.html