克隆clone() —> 使用clone()避免使用构造器生成对象。
重写clone()的原因:
- clone()本来的修饰符是protected,范围只是本类,本包和子类,范围不够大。在下面的例子中,CloneTest类中想使用其他类的clone()方法,不在本类,有时候不一定在本包,不是子类,改成public的修饰符方便在测试类或者其他类中调用。
- 在Object.clone()只是提供了浅层克隆,对于基本类型的字段,可以说它成功克隆了。但对于对象型字段,它并没有实现克隆的功能,仅仅把对象的引用复制了,如同下面的浅克隆的情况,所以含有对象类型的话要“定制”完成深度克隆。
未使用克隆的情况:
package Day07.Exercise.CloneTest;
public class TestNoClone {
public static void main(String[] args) {
TestNoClone t1 = new TestNoClone();
TestNoClone t2 = t1;
System.out.println(t1);
System.out.println(t2);
System.out.println(t1==t2);
}
}
运行结果:
Day07.Exercise.CloneTest.Test@4554617c
Day07.Exercise.CloneTest.Test@4554617c
true
上面没有使用克隆,可以看到t1和t2的地址相同,引用t1和引用t2都指向堆内存的同一个地址。
使用浅克隆:
package Day07.Exercise.CloneTest;
public class Computer implements Cloneable{
// 实现接口
private double height;
private String brand;
public Computer(double height, String brand) {
this.height = height;
this.brand = brand;
}
@Override
public Computer clone() throws CloneNotSupportedException {
// 重写克隆方法
return (Computer)super.clone();
}
}
package Day07.Exercise.CloneTest;
public class Person implements Cloneable {
// 实现接口
private String name;
private int age;
private Computer compute