淺轉殖:原始型別為值傳遞,物件型別仍為引用傳遞。
深轉殖:所有元素或屬性均完全複製,與原物件完全脫離,也就是說所有對於新物件的修改都不會反映到原物件中。
這裡主要講深轉殖,要轉殖序列化的物件,只需將物件序列化輸入位元組流中,然後再從位元組流讀出,這樣就可以建立乙個新的物件了,新物件和母物件不存在引用共享問題,真正實現對像的深轉殖。
public
class
serialcloneable
implements
cloneable, serializable catch (ioexception e) catch (classnotfoundexception e)
return
null;}}
需轉殖的物件
public
class
employee
extends
serialcloneable
public string getname()
public
void
setname(string name)
public
double
getsalary()
public
void
setsalary(double salary)
public date gethireday()
public
void
sethireday(date hireday)
@override
public string tostring()
public
void
raisesalary(double bypercent)
}
測試
可以看出,當母物件的salary值發生改變,並沒有影響到子物件,因為使用深轉殖他們就不存在引用共享問題
序列化與物件轉殖
對於深轉殖而言,如果類有很多的引用型別域,那麼重寫clone 方法依次複製各個域是很麻煩。如果引用型別的域也是油引用型別組成的,則應該考慮使用序列化的方式實現深轉殖,下面給出乙個例子 1 編寫乙個address類,該類定義了3個域,國家,省份和城市。public class address impl...
JS如何進行物件的深轉殖(深拷貝)
js中,一般的賦值傳遞的都是物件 陣列的引用,並沒有真正的深拷貝乙個物件,如何進行物件的深拷貝呢?var a var b a b.name jone console.log a.name jone 上述 中,b指向a所指向的棧物件,也就是說a,b指向同乙個棧物件,這種屬於物件的淺拷貝。var a v...
JS如何進行物件的深轉殖(深拷貝)?
js中,一般的賦值傳遞的都是物件 陣列的引用,並沒有真正的深拷貝乙個物件,如何進行物件的深拷貝呢?var a var b a b.name jone console.log a.name jone 上述 中,b指向a所指向的棧物件,也就是說a,b指向同乙個棧物件,這種屬於物件的淺拷貝。var a v...