『壹』 如何克隆Java對象
Java中的對象涉及使用引用類型,沒有直接的方法可將一個對象的內容復制到一個新對象中。將一個引用分配給另一個引用只會給相同對象建立另一個引用。因此,Java對所有引用類型使用一個特殊的clone()方法,為對象復制自身提供一個標準的機制。以下是你需要了解和克隆Java對象有關的細節。為何建立一個本地拷貝?給一個對象建立本地拷貝的原因很可能是由於你計劃修改該對象,並且你不想修改方法調用者的對象。如果你確定你需要一個本地拷貝,你可以使用Object類的clone()方法來執行這項操作。clone()方法被定義為受保護方法,但你必須在你希望克隆的所有子類中重新公開定義它。例如,標准庫類ArrayList忽略clone(),但你可以這樣為ArrayList調用clone()方法:import java.util.*;class MyInt {private int i;public MyInt(int ii) { i = ii; }public void increment() { i++; }public String toString() {return Integer.toString(i);}}public class Test {public static void main(String[] args) {ArrayList al = new ArrayList();for(int i = 0; i < 10; i++ )al.add(new MyInt(i));ArrayList al1 = (ArrayList)al.clone();// Increment all al1』s elements:for(Iterator e = al1.iterator(); e.hasNext(); ) ((MyInt)e.next()).increment();}}clone()方法生成一個Object,它必須重新轉變為適當的類型。這個例子說明ArrayList的clone()方法如何不能自動克隆ArrayList包含的每一個對象?原有ArrayList和克隆後的ArrayList是相同對象的別名。這種情況通常叫做淺拷貝,因為它僅僅復制一個對象的「表面」部分。實際的對象由這個「表面」,引用指向的所有對象,以及那些對象指向的所有對象等構成。這往往被稱作「對象網路」。下一頁>>
『貳』 Java中,復制一個對象,有什麼好的方法
使用Java的反射機制實現:為了能更好的區分,寫成了兩個類,可以運行下面的代碼看看效果
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) throws Exception {
Customer1 c1 = new Customer1();
c1.setName("c1");
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
c1.setList(list);
Map<String,String> map = new HashMap<String, String>();
map.put("map1", "map1");
map.put("map2", "map2");
c1.setMap(map);
Customer2 c2 = new Customer2();
//
Class c = c1.getClass();
Class class2 = c2.getClass();
Field fields[] = c.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getMethodName = "get" + firstLetter + fieldName.substring(1);
String setMethodName = "set" + firstLetter + fieldName.substring(1);
Method getMethod = c.getMethod(getMethodName, new Class[] {});
Method setMethod = class2.getMethod(setMethodName,
new Class[] { field.getType() });
Object value = getMethod.invoke(c1, new Object[] {});
setMethod.invoke(c2, new Object[] { value });
}
System.out.println(c2.getName());
System.out.println(c2.getList());
System.out.println(c2.getMap());
}
}
class Customer1 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
class Customer2 {
private String name;
private List<String> list;
private Map<String, String> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
『叄』 java 已知一個對象的引用,如何復制一個對象呢
obj.clone();2樓那個只是兩個引用指向一個對象!
『肆』 java怎麼樣構造函數復制一個對象
一、用Object 本身的復制對象的方法, clone()。對象可克隆的類必須實現Cloneable介面,並且clone方法是淺克隆。
二、類實現Serializable,用ObjectOutputStream、ObjectInputStream 來復制對象。
對象克隆有點復雜,尤其是第一種。
關於這個問題你可以搜索:
JAVA深復制(深克隆)與淺復制(淺克隆)
這篇文章看看。
『伍』 java對象復制的問題
1.
被復制的類需要實現Clonenable介面(不實現的話在調用clone方法會拋出CloneNotSupportedException異常)
該介面為標記介面(不含任何方法)
2.
覆蓋clone()方法,訪問修飾符設為public。方法中調用super.clone()方法得到需要的復制對象,(native為本地方法)
『陸』 Java 如何復制對象
可以使用clone來實現,clone用於為引用類型的復制
1.使用clone方法的類必須先實現Cloneable介面,不然clone方法會直接返回CloneNotSupportedException不支持克隆的異常
2、實現Cloneable介面的類應該使用公共方法重寫 Object.clone(它是受保護的)。某個對象實現了此介面就克隆它是不可能的。即使 clone 方法是反射性調用的,也無法保證它將獲得成功。
3、在Java.lang.Object類中克隆方法是這么定義的:
protected Object clone()
throws CloneNotSupportedException
創建並返回此對象的一個副本。表明是一個受保護的方法,同一個包中可見。
『柒』 如何復制一個java對象
/**
*復制對象
*
*@paramsrcObj
*@return
*/
publicstaticObjectdepthClone(ObjectsrcObj){
if(srcObj==null){
returnnull;
}
ObjectcloneObj=null;
ByteArrayOutputStreamout=null;
ObjectOutputStreamoo=null;
ByteArrayInputStreamin=null;
ObjectInputStreamoi=null;
try{
out=newByteArrayOutputStream();
oo=newObjectOutputStream(out);
oo.writeObject(srcObj);
in=newByteArrayInputStream(out.toByteArray());
oi=newObjectInputStream(in);
cloneObj=oi.readObject();
}catch(IOExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}finally{
if(out!=null){
try{
out.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(oo!=null){
try{
oo.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(in!=null){
try{
in.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
if(oi!=null){
try{
oi.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
}
returncloneObj;
}
『捌』 關於java克隆對象
--在使用clone方法時,對於每一個類,都需要做如下判斷:
1--默認的clone方法是否能滿足要求
2--默認的clone方法是否能通過調用可變子對象的clone方法修補
3--是否不應該使用clone
----如選擇1和2,就必須實現Cloneable介面,使用public重定義clone方法
意思就是,你如果想用clone方法,首先要考慮Object的clone能不能滿足你的需求,如果可以,那好,直接調用,反之,你就得必須在需要使用clone方法的類中實現Cloneable介面,自己寫一個Clone規則。
『玖』 java中clone出的對象怎麼用
首先必須實現介面,publicinterfaceCloneable此類實現了Cloneable介面,以指示Object.clone()方法可以合法地對該類實例進行按欄位復制。如果在沒有實現Cloneable介面的實例上調用Object的clone方法,則會導致拋出CloneNotSupportedException異常。按照慣例,實現此介面的類應該使用公共方法重寫Object.clone(它是受保護的)。請參閱Object.clone(),以獲得有關重寫此方法的詳細信息。==》protectedObjectclone()注意,此介面不包含clone方法。因此,因為某個對象實現了此介面就克隆它是不可能的。即使clone方法是反射性調用的,也無法保證它將獲得成功。{publicDated=newDate();@OverridepublicBoxclone(){Boxcloned=(Box)super.clone();cloned.d=(Date)d.clone();return(Box)super.clone();}publicstaticvoidmain(String[]args)throwsException{Boxb=newBox();Boxb2=(Box)b.clone();System.out.println(b.d==b2.d);}}測試後直接返回的話結果是地址相等。你在克隆後用了set方法重新操作了,肯定是不一樣的。。。。!!!3,注釋起來後結果是改變了的,你會不會是沒編譯保存。你們老師是說的對的你好,當然知道你說的那樣。我正是因為三個的試過了,所以最後沒改回去,那不正是你第二個問題嘛。。。如果是深克隆就是FALSE不是深克隆就返回TRUE啊。
『拾』 java如何深度一個object
java本身好像沒有提供這個方法的吧,只有你自己重新創建一個對象,然後賦值給這個對象。
iamge的復制可以用BufferedImage的方法:
public WritableRaster Data(WritableRaster outRaster)計算 BufferedImage 的一個任意矩形區域,並將其復制到指定的 WritableRaster。要計算的區域由指定 WritableRaster 的邊界確定。指定 WritableRaster 必須具有與此圖像兼容的 SampleModel。如果 outRaster 為 null,則創建一個合適的 WritableRaster。
不過還有一個簡單的辦法,就是創建一個一樣大小和一樣類型的BufferedImage,然後把要復制的圖畫上去,這兩個圖片就是一樣的了。