被複製物件的所有變數都含有與原來的物件相同的值,而所有的對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不複製它所引用的物件。
被複製物件的所有變數都含有與原來的物件相同的值,除去那些引用其他物件的變數。那些引用其他物件的變數將指向被複製過的新物件,而不再是原有的那些被引用的物件。換言之,深複製把要複製的物件所引用的物件都複製了一遍(遞迴下去)。
clone方法將物件複製了乙份並返回給呼叫者。
一般而言,clone()方法滿足:
1)對任何的物件x,都有x.clone() !=x
轉殖物件與原物件不是同乙個物件
2)對任何的物件x,都有x.clone().getclass()= =x.getclass()
轉殖物件與原物件的型別一樣
3)如果物件x的equals()方法定義恰當,那麼x.clone().equals(x)應該成立。
實現:1)為了獲取物件的乙份拷貝,我們可以利用object類的clone()方法。
2)在派生類中覆蓋基類的clone()方法,並宣告為public(object類中的clone()方法為protected的)
3)在派生類的clone()方法中,呼叫super.clone()
4)在派生類中實現cloneable介面
public class student implements cloneable
public book getbook()
public void setbook(book book)
public void setage(int age)
public string getname()
public void setname(string name)
@override
public object clone() throws clonenotsupportedexception
}
public class book
public void setname(string name)
}
public class test
}
方式一:利用clone方法
public class fruit implements cloneable
public void setname(string name)
} }@override
public object clone() throws clonenotsupportedexception
}
public string name = "";
public string getname()
public void setname(string name)
@override
public object clone() throws clonenotsupportedexception
}
public class test
}
方式二:序列化方式
public class people implements serializable
public void setname(string name)
public girl getgirl()
public void setgirl(girl girl)
public object deepcopy() throws exception
}
public class girl implements serializable
public void setname(string name)
}
public class test
}
java基礎 轉殖
值傳遞 比如我們的基本資料型別 int char double long byte boolean long short 引用傳遞 除此以為的都是引用傳遞,尤其是我們在建構函式的引數時候 clone 1.拷貝物件返回的是乙個新的物件,而不是乙個對原來物件的引用 2.拷貝物件與用new操作符返回的物件...
Java基礎篇 深轉殖與淺轉殖
轉殖,顧名思義,即是產生乙個與原物件 完全 一樣的乙個新物件。這裡的一樣,或許是表面的一樣,或許是真的一樣。這就牽扯到兩個新定義 淺轉殖與深轉殖。淺轉殖 新物件的基礎型別的變數值與原物件相同,而特殊物件,即非八大基本型別的物件與原物件指向同一記憶體空間,不管新老物件誰對這段空間進行操作都會影響到另乙...
JAVA 物件轉殖clone
有時候我們希望轉殖乙個已存在的物件,並對其進行操作,但是不希望改變原物件,這時使用clone技術就非常方便了。但是使用clone,也有一些需要注意的地方,因為clone有淺層轉殖和深層轉殖。還是習慣先直接上 結合 講解。注 如果你希望某個類具有clone功能,該類必須實現介面cloneable,它是...