【就你不知道-Java clone】

来源:互联网 发布:linux snmp服务器配置 编辑:程序博客网 时间:2024/04/30 13:41



请看下面的代码

一:code

public class Clone implements Cloneable{private int num;public int getNum() {return num;}public void setNum(int num) {this.num = num;}@Overrideprotected Object clone() throws CloneNotSupportedException {Object obj = null;try {obj = super.clone();} catch (Exception e) {e.printStackTrace();}return obj;}}


二:测试一


@Testpublic void test() {try {Clone c = new Clone();c.setNum(2);Clone c2 = (Clone)c.clone();c2.setNum(4);System.out.println(c);System.out.println(c2);System.out.println(c==c2);System.out.println(c.getNum());System.out.println(c2.getNum());} catch (CloneNotSupportedException e) {e.printStackTrace();}}

输出:

Clone@ad3ba4
Clone@126b249
false
2
4

注:clone重新分配内存空间给clone后的对象。


三:

@Testpublic void test2(){Vector<Clone> v = new Vector<Clone>();v.add(new Clone());Vector<Clone> v2 = (Vector<Clone>) v.clone();v2.get(0).setNum(5);System.out.println(v);System.out.println(v2);System.out.println(v==v2);System.out.println(v.equals(v2));System.out.println(v.get(0).getNum());System.out.println(v2.get(0).getNum());}

[Clone@45a877]
[Clone@45a877]
false
true
5
5


注:个人看看,能看出来什么不。


四:


@Testpublic void test3() throws CloneNotSupportedException{class TTTT implements Cloneable{Clone c ;public Clone getC() {return c;}public void setC(Clone c) {this.c = c;}@Overrideprotected Object clone() throws CloneNotSupportedException {// TODO Auto-generated method stubreturn super.clone();}};TTTT t = new TTTT();Clone c = new Clone();c.setNum(2);t.setC(c);TTTT t2 = (TTTT) t.clone();t2.getC().setNum(3);System.out.println(t);System.out.println(t2);System.out.println(t==t2);System.out.println(t.equals(t2));System.out.println(t.getC().getNum());System.out.println(t2.getC().getNum());}


Clone$1TTTT@126b249
Clone$1TTTT@182f0db
false
false
3
3


注:clone了TTTT,有2个对象TTTT在内存中,但是TTTT中的clone仍然是同一个对象。


实现clone需要如下操作:




原创粉丝点击