所在的位置: java >> 培训学校 >> Java里的clone方法

Java里的clone方法

Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类时,此时便是引用传递而不是值传递。以下是一个小例子:

publicclassA{publicStringname;}456789101publicclasstestClone{publicvoidchangeA(Aa){a.name="b";}publicvoidchangInt(inti){i=i*2+;}/***

paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubtestClonetest=newtestClone();Aa=newA();a.name="a";System.out.println("beforechange:a.name="+a.name);test.changeA(a);System.out.println("afterchange:a.name="+a.name);inti=1;System.out.println("beforechange:i="+i);test.changInt(i);System.out.println("afterchange:i="+i);}

此时输出的结果是:

beforechange:a.name=a

afterchange:a.name=b

beforechange:i=1

afterchange:i=1

从这个例子知道Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。

除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递",如:

4567Aa1=newA();Aa2=newA();a1.name="a1";a2=a1;a2.name="a2";System.out.println("a1.name="+a1.name);System.out.println("a2.name="+a2.name)

此时输出的结果是:

a1.name=a2

a2.name=a2

如果我们要用a2保存a1对象的数据,但又不希望a2对象数据被改变时不影响到a1。实现clone()方法是其一种最简单,也是最高效的手段。

下面我们来实现A的clone方法

456789101publicclassAimplementsCloneable{publicStringname;publicObjectclone(){Ao=null;try{o=(A)super.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();}returno;}}

首先要实现Cloneable接口,然后在重载clone方法,最后在clone()方法中调用了super.clone(),这也意味着无论clone类的继承结构是什么样的,super.clone()直接或间接调用了java.lang.Object类的clone()方法。

4567Aa1=newA();Aa2=newA();a1.name="a1";a2=(A)a1.clone();a2.name="a2";System.out.println("a1.name="+a1.name);System.out.println("a2.name="+a2.name);

此时输出的结果是:

a1.name=a1

a2.name=a2

尚学堂公告

1.“西安迪欧软件有限公司”是我们的名称,经营范围:投资、运营、管理,旗下品牌“尚学堂”为自有品牌。

2.“尚学堂”只有西安、深圳、郑州三个直属分校,其他只是加盟分校,无技术支持,一旦出现问题,我们不承担法律责任。

联系我们

-







































江苏最好的白癜风医院
武汉治疗白癜风最好的专科医院



转载请注明:http://www.jiaju1314.com/pxxx/1325.html

  • 上一篇文章:
  •   
  • 下一篇文章: