浅析java中clone()方法

本文转载自:http://blog.csdn.net/mengxiangyue/article/details/6818611

Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函数的时候,我们希望在这个函数中所做的操做,并不会影响到这个对象本身。但是在java传递都是引用,所以往往我们在函数内部改变了对象的某一个值,在函数外面调用该对象的时候,相应的值也同样被改变了,例如下面的程序:

class Test

{

static void myMethod(Point pt1)

{

pt1.x = 23;

System.out.println("x="+pt1.x);

}


   public static void main(String[] args)

{

Point pt = new Point(2,4);

System.out.println("x="+pt.x);

myMethod(pt);

System.out.println("x="+pt.x);

}

}

class Point{

   int x,y;   

   Point (int x,int y)

   {

       this.x = x;

      this.y = y;

   }

}

输出的结果是

x=2

x=23

x=23

但是我们想要的结果是在我们调用了函数myMethod()方法后x的值不会改变,仍然是2。由于java中的传参是引用类型,所以会出现这样的结果,我们希望传递的是对象的一份拷贝,所以这里就用到了Object的clone()方法。

       克隆的实现需要一下几步:

在派生类中覆盖基类的clone()方法,并声明为public。

在派生类的clone()方法中,调用super.clone()。

在派生类中实现Cloneable接口。Cloneable接口没有任何抽象的方法,这样的成为标识接口。实现这个接口,只是为了告诉编译器这个对象可以被克隆了。我们按照上面的步骤将上面的代码修改如下:

class Test
{
static void   myMethod(Point pt1)
{
pt1.x = 23;
System.out.println("x="+pt1.x);
}
   public static void main(String[] args)
   {
  Point pt = new Point(2,4);
  System.out.println("x="+pt.x);
  Point pt2 = (Point)pt.clone();
  myMethod(pt2);
  System.out.println("x="+pt.x);
   }
}
class Point implements Cloneable{
   int x,y;   
   Point (int x,int y)
   {
       this.x = x;
      this.y = y;
   }
   public Object clone()
   {
  Point p = null;
  try
  {
  p = (Point)super.clone();
  }
  catch (Exception e)
  {
  e.printStackTrace();
  }
  return p;
   }
}

输出的结果是:

x=2
x=23
x=2

首先我们在派生类中覆盖了Object类的Clone()方法,并声明为public的。然后我们调用了super.clone()方法,这里会抛出一个异常(对于这个异常大家可以自己查看java的帮助文档),所以必须用try……catch……语句捕获,然后返回此对象。这里需要说明一下,Clone()方法返回的是Object类型的,所以需要强制类型转换

       对于javaclone()方法的浅析希望能给您带来帮助。

posted @ 2017-02-26 23:45  哈洛加斯  阅读(1680)  评论(0编辑  收藏  举报