java Clone接口和深拷贝详解

网友投稿 257 2022-12-15

java Clone接口和深拷贝详解

对于数组的拷贝,如果是简单类型的话是深拷贝,如果是引用类型的话是浅拷贝,但是因为java是面向对象的,在回答面试官问题的时候,我们可以不用说的这么细,可以直接说浅拷贝。

代码示例1

class Person implements Cloneable{//如果想克隆自定义类,那么需要在自定义类上实现Cloneable接口

public int age;

/*疑问:为什么这个接口是空接口呢?这是一个面试问题。

空节课:也把它叫做标记接口。其实就是这个意思:只要一个类实现了这个接口,那么就标记这个类是可以进行clone的

*

* 2:重写clone方法*/

@Override

protected Object clone() throws CloneNotSupportedException {//重写了父类的克隆方法

return super.clone();

}

}

public class TestDemo {

public static void main(String[] args) throws CloneNotSupportedException {

Person person1 = new Person();

Person person2 = (Person) person1.clone();

System.out.println(person1.age);

System.out.println(person2.age);

System.out.println("=======修改=======");

person2.age = 99;

System.out.println(person1.age);

System.out.println(person2.age);

}

/*public static void main(String[] args) {

int[] array = {1,2,3,4,5,6};

int[] array2 = array.clone();//对这个数组进行克隆

array2[0] = 33;//改变拷贝后的数组元素的值不会影响原来数组的元素,这种情况是深拷贝

System.out.println(Arrays.toString(array2));

System.out.println(Arrays.toString(array));

}*/

}

输出为:

因为改变的是简单类型,所以这种情况是深拷贝。

代码示例2

class Money{

double money = 12.5;

}

class Person implements Cloneable{//如果想克隆自定义类,那么需要在自定义类上实现Cloneable接口

public int age;

/*疑问:为什么这个接口是空接口呢?这是一个面试问题。

空节课:也把它叫做标记接口。其实就是这个意思:只要一个类实现了这个接口,那么就标记这个类是可以进行clone的

*

http:// * 2:重写clone方法*/

Money m = new Money();

@Override

protected Object clone() throws CloneNotSupportedException {//重写了父类的克隆方法

return super.clone();

}

}

public class TestDemo {

public static void main(String[] args) throws CloneNotSupportedException {

Person person1 = new Person();

Person person2 = (Person) person1.clone();

System.out.println(person1.m.money);

System.out.println(person2.m.money);

System.out.println("=========修改==========");

person2.m.money = 99.9;

System.out.println(person1.m.money);

System.out.println(person2.m.money);

}

}

输出为:

可以参考以下图分析:

这种情况就是浅拷贝,那么可以将这个浅拷贝变成深拷贝吗?只需要将Money也克隆一下

class Money implements Cloneable{//如果想要变成深拷贝的话,那么money也需要被克隆。

double money = 12.5;

@Override

protected Object clone() throws CloneNotSupportedException {

return super.clone();

}

}

class Person implements Cloneable{//如果想克隆自定义类,那么需要在自定义类上实现Cloneable接口

public int age;

Money m = new Money();

@Override

protected Object clone() throws CloneNotSupportedException {//重写了父类的克隆方法

PAweCosQF Person p = (Person)super.clone();//1:将当前的对象克隆一份,克隆person

p.m = (Money) this.m.clone();//2:克隆当前的Money对象

return p;

}

}

public class TestDemo {

public static void main(String[] args) throws CloneNotSupportedException {

Person person1 = new Person();

Person person2 = (Person) person1.clone();

System.out.println(person1.m.money);

System.out.println(person2.m.money);

System.out.println("=========修改==========");

person2.m.money = 99.9;

System.out.println(person1.m.money);

System.out.println(person2.m.money);

}

}

这样就就将浅拷贝转变成了深拷贝,可以参考以下图分析:

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我们的更多内容!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java 包装类型及易错陷阱详解
下一篇:详谈java中int和Integer的区别及自动装箱和自动拆箱
相关文章

 发表评论

暂时没有评论,来抢沙发吧~