黑马程序员技术交流社区

标题: Objectl类的clone()方法的用法 [打印本页]

作者: 唐僧踏歌    时间: 2014-4-20 17:21
标题: Objectl类的clone()方法的用法
本帖最后由 唐僧踏歌 于 2014-4-23 12:24 编辑

public class ObjectTest {

public static void main(String[] args) throws Exception
{
  ObjectTest man=new ObjectTest();
  
  Object man2=man.clone();
  System.out.println(man2.toString());
}
}
为什么会出异常?

作者: anqi    时间: 2014-4-20 17:25
本帖最后由 anqi 于 2014-4-20 17:30 编辑

Api文档上说
如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException。注意,所有的数组都被视为实现接口 Cloneable。
  1. public class ObjectTest implements Cloneable{  //实现接口就行了

  2. public static void main(String[] args) throws Exception
  3. {
  4.   ObjectTest man=new ObjectTest();
  5.   
  6.   Object man2=man.clone();
  7.   System.out.println(man2.toString());
  8. }
  9. }
复制代码




作者: 天山    时间: 2014-4-20 17:30
public interface Cloneable 
如果一个类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 
如果在没有实现 Cloneable 接口的实例上调用 Object的 clone 方法,则会导致抛出 CloneNotSupportedException异常。 
按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。 
注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 
作者: 左拉    时间: 2014-4-20 19:49
跟克隆有关的两个类分别是Cloneable接口和Object类中的clone方法,通过两者的协作来实现克隆。首先看一下java api doc中关于Cloneable接口和Object类中的clone方法的描述:

java.lang.Cloneable 接口(以下源引JavaTM 2 Platform Standard Ed. 5.0 API DOC)

此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException异常。

按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。

注意,此接口不包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。

解读:Cloneable接口没有任何方法,仅是个标志接口(tagging interface),若要具有克隆能力,实现Cloneable接口的类必须重写从Object继承来的clone方法,并调用Object的clone方法(见下面Object#clone的定义),重写后的方法应为public 的。For example(标准写法):

  1. class CloneClass implements Cloneable{
  2.       public int aInt;
  3.       //重写clone方法
  4.       public Object clone(){  
  5.             CloneClass o = null;  
  6.             try{  
  7.                    o = (CloneClass)super.clone();  
  8.             }
  9.            catch(CloneNotSupportedException e){  
  10.            e.printStackTrace();  
  11.       }
  12.           return  o;
  13.     }
  14. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2