目录
🚩克隆步骤
🚩拷贝
🎈浅拷贝
🎈深拷贝
🚩源代码
🚩克隆步骤
我们需要重写Override方法中的clone方法。
代码的底层是不可以见的。
❗调用clone()方法的返回值是Object类 ,而我们拷贝给子类,所以需要强制类型转换。
❗ 抛出异常问题,后面说到异常的时候我会详细说清楚
实现克隆我们需要四个步骤:
第一步:声明接口implements Cloneable第二步:重写clone()方法
第三步:声明异常 throws CloneNotSupportedException
第四步:向下转型(强转)因为clone()返回的是父类,父类拷贝给子类,需要向下转型。
🚩拷贝
克隆之后的值确实相等的值。
🎈浅拷贝
class Money{
public double money=12.5;
}
class Student implements Cloneable{
int age;
public Money money=new Money();
public Student(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
}
我们在Student类里定义一个Money类,相当于Student的成员;
money对象指向了自己的成员变量money值为12.5
现在我们将student1拷贝给student2,我们可以看到他们的money值是一样的。
指向的是同一块空间。
如果我们修改money的值呢?
我们改变student2里面money指向的对象的值,也同时改变了student中money指向的值,因为我们只是拷贝了student里面的成员,而没有给成员的成员拷贝,所以都还是指向了同一块空间,改变money的值就会让都改变。这就是浅拷贝
🎈深拷贝
我们需要给money指向的成员也创建一个空间
ox87空间的money修改,不会影响0x99里的money的值。这叫深拷贝。
我们就像Student克隆的步骤都进行一遍。
protected Object clone() throws CloneNotSupportedException {
Student tmp=(Student) super.clone();
tmp.money=(Money) this.money.clone();
return tmp;
}
创建一个临时对象,然后super.clone(),因为super是自己的父类,我们需要向下转型,强转,给Student类里的成员拷贝,然后我们继续给Student里面的成员Money类创建的成员拷贝,需要调用当前对象的this。
🚩源代码
package CloneClass;
class Money implements Cloneable{
public double money=12.5;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Student implements Cloneable{
int age;
public Money money=new Money();
public Student(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Student tmp=(Student) super.clone();
tmp.money=(Money) this.money.clone();
return tmp;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
'}';
}
}
public class Test1 {
public static void main(String[] args)throws CloneNotSupportedException {
// Student student1=new Student(10);
// Student student2=(Student) student1.clone();
// System.out.println(student1);
// System.out.println(student2);
System.out.println("修改前==============");
Student student1=new Student(10);
Student student2=(Student) student1.clone();
System.out.println("studetn1::"+student1.money.money);
System.out.println("student2::"+student2.money.money);
System.out.println("修改后==============");
student1.money.money=199.99;
System.out.println("studetn1::"+student1.money.money);
System.out.println("student2::"+student2.money.money);
}
}