1、jdk,Object类定义了clone方法,是native方法,方法的注释如下,有一很重要的注释是:(1)如果类不实现Cloneable接口,克隆时就会抛出CloneNotSupportedException异常;
2、(2)编写测试类TestClone1,测试这种情况,发现确实会抛出异常。
3、注意,Object类中的clone方法是这样定义的:protected native Object clone() throws CloneNotSupportedException;其权限是用protected修饰的,表示这个方法只能被自身或者其子类中调用,其他地方不能调用。
4、实现浅克隆(1)编写Bean1,定义一个字符串。
5、(2)编写Bean2,实现Cloneable接口,定义一个基本类型变量i,和一个引用变量bean1,添加get set方法;重写clone方法,调用Object类中的clone方法。
6、(3)编写测试类:TestClone2。创建一个Bean2类的实例t1,给t1的成员变量i和bean1赋值,然后根据实例t1克隆实例t2,比较t1和t2的值。
7、(4)查看输出:发现t2和t1不是同一个引用,t2的i也变成了10,正常。但是t2的bean1引用和t1的bean1引用相同,通过t2给bean1对象的str赋值“xyx”,发现t1也被改变了,这也就足以说明了浅克隆
8、深度克隆:要想实现深度克隆,就必须将幞洼踉残Bean2中的引用变量bean1属性也进行克隆(1)使Bean1实现Cloneable接口,重写c造婷用痃lone方法,调用Object的clone方法,克隆当前对象(2)重新修改Bean2中的clone方法,将bean1变量的克隆结果obj,存储到t中。
9、(3)运行测试程序:发现此时t2中的bean1和t1的不同了,且修改t2中的bean1的str值,不会影响到t1。至此一个简单的深度克隆也结束了,如果要克隆某个对象,则这个对象要实现Cloneable接口,并且要重写clone方法。深度克隆,就是对被克隆对象的每一个引用类型的属性都进行克隆,一层层克隆,可以实现所有引用类型的覆盖。