java怎么java clone方法自己写的类

Java语言提供的clone()方法、深克隆
所有的类都继承自。事实上,类提供一个方法,可以将一个对象复制一份。因此在中可以直接使用提供的方法来实现对象的克隆。
&&&&需要注意的是能够实现克隆的类必须实现一个标识接口,表示这个类支持被复制。
如果一个类没有实现这个接口但是调用了方法,编译器将抛出异常。
如下代码所示:
     
     
一般而言,语言中的方法满足:
对任何对象,都有,即克隆对象与原型对象不是同一个对象;
对任何对象,都有,即克隆对象与原型对象的类型一样;
如果对象的方法定义恰当,那么应该成立。
为了获取对象的一份拷贝,我们可以直接利用类的方法,具体步骤如下:
在派生类中覆盖基类的方法,并声明为;
在派生类的方法中,调用;
派生类需实现接口。
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。
在语言中,如果需要实现深克隆,可以通过序列化等方式来实现。序列化就是将对象写到流的过程,写到流中的对象是原有对象的一个拷贝,而原对象仍然存在于内存中。通过序列化实现的拷贝不仅可以复制对象本身,而且可以复制其引用的成员对象,因此通过序列化将对象写到一个流中,再从流里将其读出来,可以实现深克隆。需要注意的是能够实现序列化的对象其类必须实现接口,否则无法实现序列化操作。两个类均需要实现接口。
修改后的附件类代码如下:
下载附件,文件名为
工作周报类不再使用自带的克隆机制,而是通过序列化来从头实现对象的深克隆,我们需要重新编写方法,修改后的代码如下:
工作周报类
//使用序列化技术实现深克隆
将对象写入流中
将对象从流中取出
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2010年11月 Java大版内专家分月排行榜第三
2012年1月 Java大版内专家分月排行榜第三
2010年11月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。Java Clone方法之懒人实现_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Java Clone方法之懒人实现
来源:Linux社区&
作者:kongxx
在Java的Object类中定义了(protected)clone()方法,如果自己的类需要clone方法的话需要实现Cloneable接口,并重写clone()方法和将方法访问级别改为(public)。但是如果自己的类如果属性比较多,重写clone方法还是会花去不少时间,更重要的是以后增加或者删除属性的时候也要相应修改clone方法,总的来说还是比较麻烦的。
这里如果对性能不太计较的话,其实可以有一个简单快速的方法实现clone方法,就是使用Java语言的序列化功能来实现clone方法,如下:
以下是几个测试的Bean类
import&java.io.S &&
public&class&A&implements&Serializable&{ &&
&&&&private&static&final&long&serialVersionUID&=&1L; &&
&&&&private&String& &&
&&&&private&B&b; &&
&&&&public&String&getName()&{ &&
&&&&&&&&return& &&
&&&&public&void&setName(String&name)&{ &&
&&&&&&&&this.name&=& &&
&&&&public&B&getB()&{ &&
&&&&&&&&return&b; &&
&&&&public&void&setB(B&b)&{ &&
&&&&&&&&this.b&=&b; &&
&&&&@Override&&
&&&&public&Object&clone()&{ &&
&&&&&&&&return&CloneUtil.clone(this); &&
import&java.io.S &&
public&class&B&implements&Serializable&{ &&
&&&&private&static&final&long&serialVersionUID&=&1L; &&
&&&&private&String& &&
&&&&private&C&c; &&
&&&&public&String&getName()&{ &&
&&&&&&&&return& &&
&&&&public&void&setName(String&name)&{ &&
&&&&&&&&this.name&=& &&
&&&&public&C&getC()&{ &&
&&&&&&&&return&c; &&
&&&&public&void&setC(C&c)&{ &&
&&&&&&&&this.c&=&c; &&
&&&&@Override&&
&&&&public&Object&clone()&{ &&
&&&&&&&&return&CloneUtil.clone(this); &&
import&java.io.S &&
public&class&C&implements&Serializable,&Cloneable&{ &&
&&&&private&static&final&long&serialVersionUID&=&1L; &&
&&&&private&String& &&
&&&&public&String&getName()&{ &&
&&&&&&&&return& &&
&&&&public&void&setName(String&name)&{ &&
&&&&&&&&this.name&=& &&
&&&&@Override&&
&&&&public&Object&clone()&{ &&
&&&&&&&&return&CloneUtil.clone(this); &&
Clone工具类,这个类负责通过序列化和反序列化做到对一个对象的clone
import&java.io.*; &&
public&class&CloneUtil&{ &&
&&&&public&static&Object&clone(Object&obj)&{ &&
&&&&&&&&Object&anotherObj&=&null; &&
&&&&&&&&byte[]& &&
&&&&&&&&ByteArrayOutputStream&baos&=&new&ByteArrayOutputStream(); &&
&&&&&&&&ObjectOutputStream&oos&=&null; &&
&&&&&&&&try&{ &&
&&&&&&&&&&&&oos&=&new&ObjectOutputStream(baos); &&
&&&&&&&&&&&&oos.writeObject(obj); &&
&&&&&&&&&&&&bytes&=&baos.toByteArray(); &&
&&&&&&&&}&catch(IOException&ex)&{ &&
&&&&&&&&&&&&throw&new&RuntimeException(ex.getMessage(),&ex); &&
&&&&&&&&}&finally&{ &&
&&&&&&&&&&&&if&(oos&!=&null)&{ &&
&&&&&&&&&&&&&&&&try&{ &&
&&&&&&&&&&&&&&&&&&&&oos.close(); &&
&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{ &&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&} &&
&&&&&&&&&&&&} &&
&&&&&&&&} &&
&&&&&&&&ByteArrayInputStream&bais&=&new&ByteArrayInputStream(bytes); &&
&&&&&&&&ObjectInputStream&ois&=&null; &&
&&&&&&&&try&{ &&
&&&&&&&&&&&&ois&=&new&ObjectInputStream(bais); &&
&&&&&&&&&&&&anotherObj&=&ois.readObject(); &&
&&&&&&&&}&catch(IOException&ex)&{ &&
&&&&&&&&&&&&throw&new&RuntimeException(ex.getMessage(),&ex); &&
&&&&&&&&}&catch(ClassNotFoundException&ex)&{ &&
&&&&&&&&&&&&throw&new&RuntimeException(ex.getMessage(),&ex); &&
&&&&&&&&}&finally&{ &&
&&&&&&&&&&&&if&(ois&!=&null)&{ &&
&&&&&&&&&&&&&&&&try&{ &&
&&&&&&&&&&&&&&&&&&&&ois.close(); &&
&&&&&&&&&&&&&&&&}&catch&(IOException&e)&{ &&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&} &&
&&&&&&&&&&&&} &&
&&&&&&&&} &&
&&&&&&&&return&anotherO &&
public&class&Test&{ &&
&&&&public&static&void&main(String[]&args)&throws&Exception&{ &&
&&&&&&&&A&a&=&new&A(); &&
&&&&&&&&B&b&=&new&B(); &&
&&&&&&&&C&c&=&new&C(); &&
&&&&&&&&c.setName("ccc"); &&
&&&&&&&&b.setName("bbb"); &&
&&&&&&&&b.setC(c); &&
&&&&&&&&a.setName("aaa"); &&
&&&&&&&&a.setB(b); &&
&&&&&&&&System.out.println("a:&"&+&a); &&
&&&&&&&&System.out.println("a:&"&+&a.getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getC().getName()); &&
&&&&&&&&A&anotherA&=&(A)a.clone(); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getC().getName()); &&
&&&&&&&&System.out.println("===&change&properties&of&a&==="); &&
&&&&&&&& &&
&&&&&&&&a.setName("aaaaa"); &&
&&&&&&&&a.getB().setName("bbbbb"); &&
&&&&&&&&a.getB().getC().setName("ccccc"); &&
&&&&&&&&System.out.println("a:&"&+&a); &&
&&&&&&&&System.out.println("a:&"&+&a.getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getC().getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getC().getName()); &&
&&&&&&&&System.out.println("===&change&properties&of&anotherA&==="); &&
&&&&&&&& &&
&&&&&&&&anotherA.setName("aaaa"); &&
&&&&&&&&anotherA.getB().setName("bbbb"); &&
&&&&&&&&anotherA.getB().getC().setName("cccc"); &&
&&&&&&&&System.out.println("a:&"&+&a); &&
&&&&&&&&System.out.println("a:&"&+&a.getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getName()); &&
&&&&&&&&System.out.println("a:&"&+&a.getB().getC().getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getName()); &&
&&&&&&&&System.out.println("anotherA:&"&+&anotherA.getB().getC().getName()); &&
运行测试类可以看到结果。这里通过代码可以看出这种实现还是有一些限制的:
1. 自己的bean必须实现Serializable接口;
2. 由于这种实现使用了序列化,所以性能不是很好,所以如果对象太多,不建议使用;
3. 由于在序列化的过程中没有将对象序列化到文件中,而是保留在了内存数组中,所以如果对象太大的话,会造成比较大的内存使用,需要注意。
相关资讯 & & &
& (11/30/:52)
& (07/08/:10)
& (04/22/:27)
& (11/21/:48)
& (05/21/:16)
& (07/09/:16)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款Java瀵硅薄鍏嬮殕Clone - 鎯婁簡鏃跺厜 - ITeye鍗氬?
鍗氬?鍒嗙被锛

我要回帖

更多关于 java cloneable 的文章

 

随机推荐