舉個例子(錯誤例子)
測試一下
舉例(深拷貝)
類初始化消耗太多資源(資料、硬體),為了避免消耗
給其他物件訪問,而且呼叫者可能需要修改值
以文件的拷貝為例,文件中含有文字和。為了安全,我們需要將原來的文件拷貝乙份副本,在副本上進行修改。
實現clone方法
類實現介面cloneable
cloneable介面只是標記介面(空實現),如果實現了clone方法,沒有實現介面會出異常
object中的clone方法
protected object clone()
throws clonenotsupportedexception
return
internalclone()
;}
方法實現
@override
protected object clone()
throws clonenotsupportedexception
這是淺拷貝
public
class
user
implements
cloneable
@override
protected user clone()
catch
(clonenotsupportedexception e)
return null;
}public
void
setuser
(string name,
int age)
public string tostringuser()
}
輸出一下
public
static
void
main
(string[
] args)
結果
--
--constructor method--
--user
user
user
類變數都是基本資料型別
clone方法生成的物件沒有呼叫構造方法
構造方法產生的物件改變值,並不改變原物件值
public
class
user
implements
cloneable
@override
protected user clone()
catch
(clonenotsupportedexception e)
return null;
}public
void
setuser
(string name,
int age)
public
void
addlist
(int i)
public string tostringuser()
';}}
輸出一下
public
static
void
main
(string[
] args)
結果
--
--constructor method--
--user
user
user
經過上面的分析淺拷貝,會發現,list是引用型別,那我們大體上也可以了解clone實現的原理了,官方說是這樣實現的
在記憶體中二進位製流的拷貝
我們最直觀的感受就是拷貝的物件引用了原始物件的字段,因為基本型別存的是值,引用型別存的是位址,和adapter是一樣的,我們修改a時b也會改變,因為他們指向同乙個位址。
那我們怎麼辦?為了實現原型模式的作用–深拷貝,我們可以驗證一下是否正確
public
class
user
implements
cloneable
@override
protected user clone()
catch
(clonenotsupportedexception e)
return null;
}public
void
setuser
(string name,
int age)
public
void
setlist
(arraylist
mlist)
public string tostringuser()
';}}
輸出一下
public
static
void
main
(string[
] args)
結果
--
--constructor method--
--user
user
user
以上就是正確的,但是我們不能每次都如此麻煩,深拷貝就是這樣麼?不是的,我們在初始化時要把引用型別欄位也拷貝,而不是單純的引用。
public
class
user
implements
cloneable
@override
protected user clone()
catch
(clonenotsupportedexception e)
return null;
}public
void
setuser
(string name,
int age)
public
void
addlist
(int i)
public string tostringuser()
';}}
輸出一下
user user =
newuser()
; user.
addlist(1
);user.
addlist(2
);system.out.
println
(user.
tostringuser()
);user u2 = user.
clone()
; u2.
setuser
("123"
,12231);
u2.addlist(3
);system.out.
println
(u2.
tostringuser()
);system.out.
println
(user.
tostringuser()
);
結果
user
user
user
建立型模式之原型模式
功能 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。原型模式其實就是從乙個物件建立另外乙個可定製的物件,而且不需知道任何建立的細節。優點 一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法,既隱藏了物件建立細節,又提高效能。其等於是不用重新初始化物件,而是動態地獲得物件執行時的狀...
建立型模式之原型模式
1 概述 通過給出乙個原型物件來指明所要建立的物件的型別,利用這個原型物件來建立更多相似的統一型別的物件但又不是同乙個物件 世界上可能有千千萬萬個人,但你就是你,你是獨一無二的,顏色不一樣的花火,你是最棒的 因為如果直接建立物件的話,代價可能就會比較大,它屬於建立型模式的一種,它提供了一種建立物件的...
建立型模式 原型模式
使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...