`

写clone()方法时,通常都有一行代码,是什么?

阅读更多
转帖:http://blog.csdn.net/yakihappy/archive/2009/03/11/3979366.aspx


在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。使用clone()来复制一个对象,clone()从Object类继承。所有具有clone功能的类都有一个特性,那就是它直接或间接地实现了Cloneable接口。

protected native Object clone() throws CloneNotSupportedException;

可以看出它是一个protected方法,所以我们不能简单地调用它;关键字native,表明这个方法使用java以外的语言实现。
对于 object  x,

x.clone() != x

x.clone().getClass() == x.getClass()

x.clone().equals(x)

以上返回的值都为true

要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一个引用。二是拷贝对象与用new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。

1.浅复制与深复制概念

⑴浅复制(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
⑵深复制(深克隆)

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
public class TestClone1 implements Cloneable{

     int count;

     TestClone1 next;

     public TestClone1(int count) {

          this.count=count;

          if(count>0)

               next=new TestClone1(count-1);

     }

     void add(){

          count++;

          if(next!=null)

          next.count++;

     }

     public String toString(){

          String s=String.valueOf(count)+" ";

          if(next!=null)

          s+=next.toString();

          return s;

     }

     public Object clone(){

          Object o=null;   

          try{

          o=super.clone();//如果没有实现cloneable,将会抛出CloneNotSupported异常

          }

          catch(CloneNotSupportedException e){

          System.err.println("cannot clone");

          }

          return o;

     }

     public static void main(String[] args){

          TestClone1 t=new TestClone1(1);

          System.out.println("t="+t);

          TestClone1 t1=(TestClone1)t.clone();

          System.out.println("t1="+t1);

          t.add();

          System.out.println("after added\nt t="+t+"\nt1="+t1)

    }

}

在这个例子中创建t相当于两个相连的TestClone1实例,而在调用了t的add方法之后,意想不到的结果出现了:

t=1 0

t1=1 0

after added

t t=2 1

t1=1 1

t1也发生了改变。实际上Object.clone()进行的复制有着"bitwise"原则,也就是逐位复制。对于一个对象中定义的对象,它只是简单的复制这个对象的引用。这也就是常说的浅层拷贝(shallow copy)。想要执行深层拷贝(deep copy),只需要在TestClone1 t1=(TestClone1)t.clone();后面加上t1.next=(TestClone1)t.next.clone();就能得到:

t=1 0

t1=1 0

after added

t t=2 1

t1=1 0

这个正确的结果。



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yakihappy/archive/2009/03/11/3979366.aspx
分享到:
评论

相关推荐

    java面试宝典

    35、写clone()方法时,通常都有一行代码,是什么? 11 36、GC 是什么? 为什么要有GC? 11 37、垃圾回收的优点和原理。并考虑2 种回收机制。 11 38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有...

    java面试总结

    一. Java基础部分 7 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。...21、写clone()方法时,通常都有一行代码,是什么? 15

    Java面试宝典2017.zip

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    Java问题宝典2012版

    21、写clone()方法时,通常都有一行代码,是什么? 16 22、面向对象的特征有哪些方面 17 23、java中实现多态的机制是什么? 18 24、abstract class和interface有什么区别? 18 25、abstract的method是否可同时是...

    java 面试常问的问题 如何回答

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    jquery-clone-tableheader table 头部固定

    "jquery-clone-tableheader" 是一个基于 jQuery 的插件,它的主要功能是复制表格的头部,在表格内容区域出现滚动条时,将复制的表头固定在屏幕顶端,确保用户在滚动查看数据时始终能看到列名。这种方法特别适用于大...

    软件源代码中的代码克隆现象及其检测方法.pdf

    在软件开发过程中,代码克隆(Code Clone)是一种常见的现象,指的是在不同的代码模块或程序中存在相似甚至完全相同的代码片段。代码克隆可能源于多种原因,如代码复用、快速开发、团队协同工作等。然而,不恰当的...

    java面试宝典2012版.pdf

    21、写clone()方法时,通常都有一行代码,是什么? 22、面向对象的特征有哪些方面 23、java中实现多态的机制是什么? 24、abstract class和interface有什么区别? 25、abstract的method是否可同时是static,是否可...

    JAVA面试题甲骨文

    15. 写 clone()方法时,通常都有一行代码(不是必须有),是什么? 答:super.clone()。 16. 面向对象的特征有哪些方面? 答:继承、多态、封装、抽象。 17. java 中实现多态的机制是什么? 答:通过方法重写和...

    最新Java面试宝典pdf版

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    面试宝典沃尔沃微软

    21. 写 clone() 方法时,通常都有一行代码,是什么? 通常都有一行代码是 super.clone()。 22. 面向对象的特征有哪些方面? 面向对象的特征有封装、继承、多态和抽象。 23. java 中实现多态的机制是什么? java...

    Java面试宝典2013_PDF版.pdf

    21. 写clone()方法时,通常都有一行代码,是什么? 在实现clone方法时,通常会有一行代码:return (T) super.clone();,其中T是当前类的类型。 22. 面向对象的特征有哪些方面? 面向对象编程有四个基本特征:封装...

    java 面试题

    写clone()方法时,通常都有一行代码,是什么? 通常会在`clone()`方法中调用`super.clone()`来实现对象的浅复制。例如: ```java protected Object clone() throws CloneNotSupportedException { return super....

    java笔试题汇总版 java笔试题汇总版

    Java面试题汇总版 Java是一种广泛使用的高级编程语言,它广泛应用于Android app开发、Web...21. 写 clone()方法时,通常都有一行代码(不是必须有),是什么? 通常都是`super.clone()`,用于调用父类的clone()方法。

    DataTable类Clone方法与Copy方法的区别分析

    在使用DataTable的Clone和Copy方法时,关键在于理解你对副本的需求。Clone适用于只需要表结构的情况,而Copy则用于需要结构和数据完整副本的场合。根据具体的应用场景选择合适的方法,可以更高效地管理数据,并优化...

    Java面试宝典-经典

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    java面试题大全(2012版)

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    Java面试宝典2012版

    21、写clone()方法时,通常都有一行代码,是什么? 15 22、面向对象的特征有哪些方面 15 23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是...

    java面试宝典2012

    21、写clone()方法时,通常都有一行代码,是什么? 16 22、面向对象的特征有哪些方面 17 23、java中实现多态的机制是什么? 18 24、abstract class和interface有什么区别? 18 25、abstract的method是否可同时是...

Global site tag (gtag.js) - Google Analytics