目录:
1.如何实现Cloneable接口?
2. 什么是浅拷贝? 什么是深拷贝?
1.如何实现Clonable接口?
Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要 先实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常。
实现Cloneable接口,需要注意一下四步:
第一步:一个类首先先实现Clonable接口
class Money implements Cloneable
第二步:重写clone方法
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
第三步:main函数抛异常
public static void main(String[] args) throws CloneNotSupportedException
第四步:类型转换 ,因为clone是Object的方法,此时也叫做向下转型
Person person2 = (Person)person.clone();
2. 什么是浅拷贝? 什么是深拷贝?
Cloneable 拷贝出的对象是一份“浅拷贝”。
观察如下代码:
class Money {
public double m = 99.99;
}
class Person implements Cloneable{
public Money money = new Money();
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class TestDemo3 {
public static void main(String[] args) throws CloneNotSupportedException {
Person person1 = new Person();
Person person2 = (Person) person1.clone();
System.out.println("通过person2修改前的结果");
System.out.println(person1.money.m);
System.out.println(person2.money.m);
person2.money.m = 13.6;
System.out.println("通过person2修改后的结果");
System.out.println(person1.money.m);
System.out.println(person2.money.m);
}
}
// 执行结果
通过person2修改前的结果
99.99
99.99
通过person2修改后的结果
13.6
13.6
如上代码,我们可以看到,通过clone,我们只是拷贝了Person对象。但是Person对象中的Money对象,并没有拷贝。通过person2这个引用修改了m的值后,person1这个引用访问m的时候,值也发生了改变。这里就是发生了浅拷贝。
深拷贝要求把引用money也需要改变。代码如下:
class Person implements Cloneable{
public Money money = new Money();
@Override
protected Object clone() throws CloneNotSupportedException {
Person tmp = (Person) super.clone();
tmp.money = (Money) this.money.clone();
return tmp;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94477.html