Object类clone方法

匿名 (未验证) 提交于 2019-12-02 23:52:01

Object中clone()方法是protected的,是浅拷贝,要使用clone方法,要重写它,只有实现了implements Cloneable才可以调用该方法,否则会抛出CloneNotSupportedException异常。

@Override     public Object clone(){         Object o = null;         try {             o = super.clone();         }catch (CloneNotSupportedException e){             e.printStackTrace();         } //        Person p = (Person) o; //        p.book = (Book)p.getBook().clone();              //放开这两段即为深拷贝的用法         return o;     }

在我们需要复制对象的时候常用的三种方式

public static void main(String[] args){    Book b = new Book("java");    Person p = new Person("wt",b);    Person p1 = new Person(p);    Person p2 = (Person) p.clone();    b.setBookName("js");    p.setName("zjj");    System.out.println("P:"+p);    System.out.println("P1:"+p1);    System.out.println("P2:"+p2);}

当clone使用浅拷贝(即不放开那两段)时,只拷贝对象不包含对对象引用的对象的拷贝:

P:{name:zjj, book:{bookName:js}}             P1:{name:wt, book:{bookName:js}}      //不论是p1还是p2,基本类型的数值是直接拷贝值的,但是引用类型的对象却是拷贝地址的 P2:{name:wt, book:{bookName:js}}      //这样一旦p的原始值引用的对象改变,浅拷贝后的对象也会随之变化
 

当clone使用深拷贝(即放开那两段)时:

P2:{name:wt, book:{bookName:java}}      //深拷贝时,连对象中的对象都进行的是值拷贝,所以原始值的引用对象改变不会影响它

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!