A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐僧踏歌 中级黑马   /  2014-4-20 17:21  /  1292 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐僧踏歌 于 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());
}
}
为什么会出异常?

3 个回复

正序浏览
跟克隆有关的两个类分别是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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 很给力!

查看全部评分

回复 使用道具 举报
public interface Cloneable 
如果一个类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 
如果在没有实现 Cloneable 接口的实例上调用 Object的 clone 方法,则会导致抛出 CloneNotSupportedException异常。 
按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。请参阅 Object.clone(),以获得有关重写此方法的详细信息。 
注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 
回复 使用道具 举报
本帖最后由 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. }
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马