关于clone()方法
在说明clone()方法之前,需要对值传递和引用传递有个初步的了解
关于此部分的说明,转载此文:https://www.cnblogs.com/binyue/p/3862276.htm
其中需要注意的是第三条
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。(其本质上还是引用传递,只不过这些类型是不可变类,可以理解为传值)
在对值传递和引用传递有个初步了解之后,我们开始讲解clone()方法:
Java中所有的类都继承自Object类,而Object类有一个clone()方法,此方法的作用是返回一个Object对象的复制,这个复制返回的是一个新的对象而不是引用。
使用clone()方法的步骤:
1、实现clone的类首先需要继承Cloneable接口以,此接口是一个标识接口,没有任何接口方法
2、在类中重写Object类的clone()方法
3、在clone()方法中调用super.clone()
这样就可以得到实现clone类的的一个Object对象的复制,但这存在一个问题,如果这个类中还存在引用类型怎么办?在就要对浅复制和深复制说明一下了
浅复制和深复制:
使用场景:
1、类中的成员皆为基本数据类型,使用浅复制
2、类中的成员有引用类型(此时需注意String, Integer, Double等immutable的类型特殊看待,不当成引用类型),使用深复制
浅复制和深复制的使用依据实际情况而定
浅复制:被复制对象的所有变量都含有与原来对象相同的值,引用变量仍然指向原来的对象
深复制:被复制对象的所有变量都含有与原来对象相同的值引用,引用变量指向被复制对象的新变量
Object o = super.clone(); //执行浅复制
o.attr = this.getAttr().clone(); //对于引用类型的变量调用clone(),实现深复制
return o;