在java程序中,對象可以被顯式地或者隱式地創(chuàng)建.
下面說說四種顯式的創(chuàng)建對象的方式:
● 用new語句創(chuàng)建對象
● 運(yùn)用反射手段,調(diào)用java.lang.Class 或者 java.lang.reflect.Constructor 類的newInstance()實例方法
● 調(diào)用對象的clone()方法
● 運(yùn)用序列化手段,調(diào)用java.io.ObjectInputStream 對象的 readObject()方法.
例子
Class類的forName方法
public static Class<?> forName(String className)
throws ClassNotFoundException
- 返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的
Class
對象。調(diào)用此方法等效于:
Class.forName(className, true, currentLoader)
其中 currentLoader
表示此類的定義類加載器。
例如,以下代碼片段返回 java.lang.Thread
類的運(yùn)行時 Class
描述符。
Class t = Class.forName("java.lang.Thread")
調(diào)用 forName("X") 將導(dǎo)致名為 X 的類被初始化。
-
-
- 參數(shù):
className
- 所需類的完全限定名。
- 返回:
- 具有指定名的類的
Class
對象。
- 拋出:
LinkageError
- 如果鏈接失敗
ExceptionInInitializerError
- 如果此方法所激發(fā)的初始化失敗
ClassNotFoundException
- 如果找不到該類
Object類的clone()方法
protected Object clone()
throws CloneNotSupportedException
- 創(chuàng)建并返回此對象的一個副本。“副本”的準(zhǔn)確含義可能依賴于對象的類。一般來說,對于任何對象 x,如果表達(dá)式:
x.clone() != x
是正確的,則表達(dá)式:
x.clone().getClass() == x.getClass()
將為 true,但這些不是絕對條件。一般情況下是:
x.clone().equals(x)
將為 true,但這不是絕對條件。
按照慣例,返回的對象應(yīng)該通過調(diào)用 super.clone 獲得。如果一個類及其所有的超類(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()。
按照慣例,此方法返回的對象應(yīng)該獨立于該對象(正被克隆的對象)。要獲得此獨立性,在 super.clone 返回對象之前,有必要對該對象的一個或多個字段進(jìn)行修改。這通常意味著要復(fù)制包含正在被克隆對象的內(nèi)部“深層結(jié)構(gòu)”的所有可變對象,并使用對副本的引用替換對這些對象的引用。如果一個類只包含基本字段或?qū)Σ蛔儗ο蟮囊茫敲赐ǔ2恍枰薷?super.clone 返回的對象中的字段。
Object 類的 clone 方法執(zhí)行特定的克隆操作。首先,如果此對象的類不能實現(xiàn)接口 Cloneable,則會拋出 CloneNotSupportedException。注意:所有的數(shù)組都被視為實現(xiàn)接口 Cloneable。否則,此方法會創(chuàng)建此對象的類的一個新實例,并像通過分配那樣,嚴(yán)格使用此對象相應(yīng)字段的內(nèi)容初始化該對象的所有字段;這些字段的內(nèi)容沒有被自我克隆。所以,此方法執(zhí)行的是該對象的“淺表復(fù)制”,而不“深層復(fù)制”操作。
Object 類本身不實現(xiàn)接口 Cloneable,所以在類為 Object 的對象上調(diào)用 clone 方法將會導(dǎo)致在運(yùn)行時拋出異常。
-
- 返回:
- 此實例的一個克隆。
- 拋出:
CloneNotSupportedException
- 如果對象的類不支持 Cloneable
接口,則重寫 clone
方法的子類也會拋出此異常,以指示無法克隆某個實例。
- 另請參見:
Cloneable
posted on 2007-10-29 14:12
Ke 閱讀(1484)
評論(0) 編輯 收藏 所屬分類:
java