隨筆 - 6  文章 - 129  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(14)

          隨筆檔案(6)

          文章分類(467)

          文章檔案(423)

          相冊

          收藏夾(18)

          JAVA

          搜索

          •  

          積分與排名

          • 積分 - 827218
          • 排名 - 49

          最新評論

          閱讀排行榜

          評論排行榜

          在java程序中,對象可以被顯式地或者隱式地創建.
          下面說說四種顯式的創建對象的方式:
              ●  用new語句創建對象
              ●  運用反射手段,調用java.lang.Class 或者 java.lang.reflect.Constructor 類的newInstance()實例方法
              ●  調用對象的clone()方法
              ●  運用序列化手段,調用java.io.ObjectInputStream 對象的 readObject()方法.

          例子

           

          Customer.java

          package dgut.ke.javatest;

          public class Customer implements Cloneable {

           private String name;
           private int age;
           
           public Customer() {
            this("unknown",0);
            System.out.println("call default constructor");
           }
           
           public Customer(String name,int age) {
            this.name = name;
            this.age = age;
            System.out.println("call second constructor");
           }
           
           public Object clone() throws CloneNotSupportedException {
            return super.clone();
           }
           
           public boolean equals(Object o) {
            if (this == o)
             return true;
            if (! (o instanceof Customer))
             return false;
            final Customer other = (Customer) o;
            
            if (this.name.equals(other.name) && this.age == other.age)
             return true;
            else
             return false;
           }
           
           public String toString() {
            return "customer.name = "+name+" customer.age = "+age;
           }
           /**
            * @param args
            */
           public static void main(String[] args) throws Exception{
            // 運用反射手段創建Customer對象
            Class objectClass = Class.forName("dgut.ke.javatest.Customer");
            Customer c1 = (Customer) objectClass.newInstance();
            System.out.println("c1 --> " + c1);
            
            //用new創建Customer對象
            Customer c2 = new Customer("Tom",20);
            System.out.println("c2 --> " + c2);
            
            //運用克隆手段創建Customer對象
            Customer c3 = (Customer) c2.clone();
            System.out.println("c3 --> " + c3);
            System.out.println("c2 == c3 " + (c2==c3));
            System.out.println("c2.equals(c3) " + c2.equals(c3));
           }

          }

           

          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 閱讀(1487) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 榆中县| 沾化县| 邓州市| 潞西市| 云浮市| 中卫市| 万源市| 玛多县| 辽阳市| 临沂市| 孝昌县| 喀什市| 普洱| 阿勒泰市| 平山县| 太仆寺旗| 泸西县| 和平县| 揭东县| 同江市| 达日县| 中牟县| 深泽县| 金川县| 绩溪县| 玉龙| 衡阳市| 齐齐哈尔市| 门头沟区| 南城县| 台北市| 乐东| 东港市| 长沙县| 三原县| 收藏| 平谷区| 容城县| 繁峙县| 舒城县| 永嘉县|