- Cloneable的用途
Cloneable是标记型的接口,它们内部都没有方法和属性,实现 Cloneable来表示该对象能被克隆,能使用Object.clone()方法。如果没有实现 Cloneable的类对象调用clone()就会抛出CloneNotSupportedException。 - 克隆的分类
浅克隆(shallow clone),对基本类型的变量就是值克隆,对引用类型的变量就是克隆引用,并没有克隆出一个这个引用所指向的对象,这是有缺陷的。创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址
深克隆(deep clone),不仅copy对象本身,而且copy对象包含的引用指向的所有对象。创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址
总之深浅克隆都会在堆中新分配一块区域,区别在于对象属性引用的对象是否需要进行克隆(递归性的)
clone()方法默认是浅克隆,需要自己在里面加一些东西
克隆2步曲:
1、你必须实现Cloneable接口。
2、你必须在类中重写clone()方法
浅克隆实现
public class Xx implements Cloneable{
private Nn nn;
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
深克隆实现
public class Nn implements Cloneable{
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
public class Xx implements Cloneable{
public Object clone() throws CloneNotSupportedException{
Xx xx = (Xx) super.clone();
xx.nn = (Nn) super.clone();
return Xx;
}
}
clone的源代码
1 public class Object {
2 protected native Object clone() throws CloneNotSupportedException;
3 }
native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问