淺析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()方法的淺析希望能給您帶來幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM