标签:
最近在写 hugenumber 类中自乘方法的时候遇到了一点问题。发现问题出在未对对象进行克隆上。
以下是关于克隆总结的几点;
----------------------------------------分割线--------------------------------
Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用
的区别,特别是先学c、c++后学java的程序员。并且由于Java不能通过简单的赋值来解决对象复制
的问题,在开发过程中,也常常要要应用clone()方法来复制对象。比如函数参数类型是自定义的类
时,此时便是引用传递而不是值传递。以下是一个小例子:
public class testClone { public void changeA(A a){ a.name="b"; } public void changInt(int i){ i=i*2+100; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub testClone test=new testClone(); A a=new A(); a.name="a"; System.out.println("before change : a.name="+a.name); test.changeA(a); System.out.println("after change : a.name="+a.name); int i=1; System.out.println("before change : i="+i); test.changInt(i); System.out.println("after change : i="+i); } }
当Class A成员变量类型是java的基本类型时(外加String类型),只要实现如上简单的clone(称影子clone)就可以。
但是如果Class A成员变量是数组或复杂类型时,就必须实现深度clone。
public Object clone() { A o = null; try { o = (A) super.clone(); o.name=(String[])name.clone();//其实也很简单^_^ } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; }
否则克隆的其实是原来对象的地址。
标签:
原文地址:http://www.cnblogs.com/fuxiaoshenjian/p/4597055.html