(十三).clone方法

禿頭也打碼發表於2019-01-20

1).clone方法沒有引數,而且返回主叫物件的一個副本。
Object類中的clone方法頭部如下:

public Object clone();

與從 Object類繼承的其他方法不一樣,clone方法需要重新定義,這樣才能如我們所期待的那樣使用。

如果一個類有一個拷貝拷貝構造方法,則可以通過呼叫拷貝構造方法定義clone方法返回一個主教物件的副本。

例如:

public Sale clone()
{
return new Sale (this);
}

這與官方定義的clone方法有所不同,但這樣定義確實能正確地工作。

2).clone方法較拷貝構造方法的優點

Java喜歡用clone方法替代拷貝構造方法,因為在一些情況下拷貝構造方法並不能實現期待的功能。

例如 :

分類使用clone方法和拷貝構造方法賦值一個類陣列會得到不同的結果

//A是B的基類,並且各自有clone方法和拷貝構造方法

public  static  Sale[]   badcopy()
{
    Sale[]  b=new Sale[a.length];

   for(int i=o;i<a.length;++i)
        b[i]=new  Sale(a[i]);

return   b;

}



如果引數傳入的是B,則複製得到的陣列型別並不是B型別,而是A型別。
因為Sale拷貝構造方法只是簡單的進行復制。

而用clone方法卻能得到預期的結果:

public static Sale[]  goodcopy(Sale[]  a)
{
      Sale[]  b=new Sale[a.length];

     for(int i=0;i<a.length;++i)
         b[i]=a[i].clone();
 
   return  b;
 }


這是由於後繫結,a[i].clone()總是表示正確版本的clone方法。

相關文章