黑马程序员技术交流社区
标题:
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。
public class ObjectTest implements Cloneable{ //实现接口就行了
public static void main(String[] args) throws Exception
{
ObjectTest man=new ObjectTest();
Object man2=man.clone();
System.out.println(man2.toString());
}
}
复制代码
作者:
天山
时间:
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(标准写法):
class CloneClass implements Cloneable{
public int aInt;
//重写clone方法
public Object clone(){
CloneClass o = null;
try{
o = (CloneClass)super.clone();
}
catch(CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2