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