Java中clone()的用法
- 一个类如果不显示的重写clone(),那么这个类就不能直接调用clone方法
- 在类中重写了clone方法后,发现系统还是会报错:CloneNotSupportedException
- 如何处理?一个类如果没有实现cloneable接口,但却又调用了clone方法,系统就会给出上述错误,所以我们必须要实现cloneable接口并且重写clone方法,才可以正常的使用
接下来看clone的其中一种用法:浅拷贝
拷贝对象和原始对象的引用类型引用相同的对象
定义一个类,实现cloneable接口并且重写clone方法
public class CloneExample implements Cloneable{
private int[] arr = new int[10];
public CloneExample(){
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
}
public int get(int index){
return arr[index];
}
public void set(int index,int value) {
arr[index] = value;
}
@Override
public CloneExample clone() throws CloneNotSupportedException {
return (CloneExample) super.clone();
}
}
main方法
public class CloneDemo {
public static void main(String[] args) throws CloneNotSupportedException {
CloneExample e1 = new CloneExample();
CloneExample e2 = null;
e2 = e1.clone();
e1.set(4,555);
System.out.println(e2.get(4)); //555
}
}
可以发现e2指向的是e1new出来的对象,因为当e1发生改变时,e2也随之改变了
clone的另外一种用法:深拷贝
拷贝对象和原始对象的引用类型引用不同对象
与上面不同的是这里clone方法的重写内容不一样
public class CloneExample implements Cloneable{
private int[] arr = new int[10];
public CloneExample(){
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
}
public int get(int index){
return arr[index];
}
public void set(int index,int value) {
arr[index] = value;
}
@Override
public CloneExample clone() throws CloneNotSupportedException {
CloneExample result = (CloneExample) super.clone();
result.arr = new int[this.arr.length];
for (int i = 0; i < arr.length; i++) {
result.arr[i] = arr[i];
}
return result;
}
}
在重写的时候就新构造了一个对象,并且把数值赋给他
main方法
public class CloneDemo {
public static void main(String[] args) throws CloneNotSupportedException {
CloneExample e1 = new CloneExample();
CloneExample e2 = null;
e2 = e1.clone();
e1.set(4,555);
System.out.println(e2.get(4)); //4
}
}
clone方法既复杂又有风险,不仅会抛出异常,还需要进行类型转换,尽量不要去使用clone方法,可以使用拷贝构造函数来拷贝对象
拷贝构造函数方法
此方法适用于深拷贝
package Demo02;
public class CloneExample{
private int[] arr = new int[10];
public CloneExample(){
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
}
public CloneExample(CloneExample ce){
arr = new int[ce.arr.length];
for (int i = 0; i < ce.arr.length; i++) {
arr[i] = ce.arr[i];
}
}
public int get(int index){
return arr[index];
}
public void set(int index,int value) {
arr[index] = value;
}
}
main方法
package Demo02;
public class CloneDemo {
public static void main(String[] args){
CloneExample e1 = new CloneExample();
CloneExample e2 = new CloneExample(e1);
e1.set(4,500);
System.out.println(e2.get(4)); //4
}
}
以上就是对Java中clone方法的讲解啦,有不足的地方欢迎小伙伴在评论区留言