前言
大家好,我是Maybe。昨天学了Clonable接口。着重学了深拷贝与浅拷贝。我想跟大家分享一下,一方面是为了加深自己对于这个知识的理解,另一方面是如果大家需要了解相关方面的知识,希望可以帮助大家。
举例代码如(先说浅拷贝)
package demo1;
public class Money implements Cloneable {
public double money=9.9;
@Override
protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
return super.clone();
}
}
package demo1;
public class Person implements Cloneable{
public int age;
public double score;
public String name;
public Money money=new Money();
public Person(int age, double score, String name) {
this.age = age;
this.score = score;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
return super.clone();
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", score=" + score +
", name='" + name + '\'' +
'}';
}
}
package demo1;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {//2.抛出异常
Person person1=new Person(2,90.9,"qq");
Person person2=(Person) person1.clone();//3.向下转型
System.out.println(person1.money.money);
System.out.println(person2.money.money);
System.out.println("========");
person2.money.money=19.9;
System.out.println(person1.money.money);
System.out.println(person2.money.money);
}
}
运行结果如下
通过运行结果,我们可以知道修改person2.money.money的值,也会将person1.money.money的值改变。这种就被称为浅拷贝。
画图分析如下
深拷贝
特此说明,深拷贝只需要把上面的Person类进行修改即可,Test类,Money类不变。
代码如下
package demo1;
public class Person implements Cloneable{
public int age;
public double score;
public String name;
public Money money=new Money();
public Person(int age, double score, String name) {
this.age = age;
this.score = score;
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {//1.重写父类Object的方法
// return super.clone();
Person tmp=(Person) super.clone();
tmp.money=(Money) this.money.clone();
return tmp;
}//这里修改了,有浅拷贝变为深拷贝
@Override
public String toString() {
return "Person{" +
"age=" + age +
", score=" + score +
", name='" + name + '\'' +
'}';
}
}
运行结果如下
分析如下
结语
本次分享就到此为止啦。希望大家喜欢,下次见啦!