深轉殖和淺轉殖

2021-08-28 14:52:56 字數 2088 閱讀 8121

為什麼需要轉殖?

new出來的物件中的屬性都是初始化時候的值,當需要乙個新的物件來儲存當前物件的「狀態」就靠clone方法了。直接使用object a=new object();object b;b=a不行嗎,答案是不行的。因為這只是轉殖了引用。

如何實現轉殖?

首先由兩種轉殖的方式,乙個是深轉殖,乙個是淺轉殖。他們之間的區別在於:是否支援引用型別的成員變數的複製,深轉殖會轉殖引用型別的成員變數。

protected native object clone() throws clonenotsupportedexception;
可以看出,clone()objectnative方法,而且還是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 首先,我們應該判斷它是淺複製還是深複製。對於淺拷貝來說,複製出的新物件中...