為什麼需要轉殖?
new
出來的物件中的屬性都是初始化時候的值,當需要乙個新的物件來儲存當前物件的「狀態」就靠clone
方法了。直接使用object a=new object();object b;b=a
不行嗎,答案是不行的。因為這只是轉殖了引用。
如何實現轉殖?
首先由兩種轉殖的方式,乙個是深轉殖,乙個是淺轉殖。他們之間的區別在於:是否支援引用型別的成員變數的複製,深轉殖會轉殖引用型別的成員變數。
protected native object clone() throws clonenotsupportedexception;
可以看出,clone()
是object
的native
方法,而且還是protected
以為著不能再類外進行訪問,想要實現轉殖方法,只有覆蓋這個方法。
public class student implements cloneable catch (clonenotsupportedexception e)
return student;
}...
getter and setter
...
public class test
}
stu1:張三 age:18
stu2:李四 age:20
false
上面的案例,屬於淺轉殖,轉殖物件中的屬性不包括引用物件,如果包含引用物件,則該引用物件也必須要實現cloneable介面。
public class student implements cloneable catch (clonenotsupportedexception e)
return stu;
}....
public class address implements cloneable
....
}
public class test
}
stu1:張三 age:18address北京
stu2:李四 age:20address上海
如果引用型別裡面還包含很多引用型別,或者內層引用型別的類裡面又包含引用型別,使用clone方法就會很麻煩。這時我們可以用序列化的方式來實現物件的深轉殖。
public class student implements serializable catch (ioexception e) catch (classnotfoundexception e)
return student;
}......
public class address implements serializable
.....
}
public class test
}
stu1:張三 age:18address北京
stu2:李四 age:20address上海
總結:
實現物件轉殖有兩種方式:
1). 實現cloneable介面並重寫object類中的clone()方法;
2). 實現serializable介面,通過物件的序列化和反序列化實現轉殖,可以實現真正的深度轉殖.
注意:
基於序列化和反序列化實現的轉殖不僅僅是深度轉殖,更重要的是通過泛型限定,可以檢查出要轉殖的物件是否支援序列化,這項檢查是編譯器完成的,不是在執行時丟擲異常,這種是方案明顯優於使用object類的clone方法轉殖物件。讓問題在編譯的時候暴露出來總是優於把問題留到執行時。
轉殖,深轉殖和淺轉殖
轉殖,深轉殖和淺轉殖。1.實現轉殖,繼承cloneable介面,實現clone beanutils.clonebean origin 2.深轉殖和淺轉殖的區別,淺轉殖指的是轉殖的時候僅僅轉殖物件本身 物件的基本變數 而不拷貝物件的引用變數。深轉殖指的是轉殖的時候不僅轉殖物件本身,而且拷貝物件包含的引...
淺轉殖和深轉殖
1淺轉殖 shallow copy 是通過呼叫object的clone方法,建立出和原物件 結構相同的新物件。淺轉殖 和深轉殖 deep copy 不同,如果被拷貝的物件屬性為可變類,則直接複製該引用物件的位址。這會導致,淺轉殖出來的物件 如果改變可變類屬性值,則原物件的可變類屬性值也會一起變。換句...
深轉殖和淺轉殖
function anotherfunction var anotherobject var anotherarray var myobject anotherarray.push anotherobject,myobject 首先,我們應該判斷它是淺複製還是深複製。對於淺拷貝來說,複製出的新物件中...