<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-159  評論-114  文章-7  trackbacks-0

    某個類要想實現拷貝的功能,就必須實現Cloneable接口,并覆蓋Object的clone()方法,才能真正實現克隆。

    淺拷貝,一種默認的實現,Teacher類中的clone方法的實現就是淺拷貝。

    Student類的clone方法就是深拷貝。注意super.clone返回的對象實際上是被類的對象,可以放心強制轉換,至于為什么,我也不知道,估計得讀虛擬機規范,從Object源碼看也不到什么,因為是protect native Object clone();


    import java.util.*;
    public class TestClone{
     
    public static void main(String[] args)
     
    {
      Teacher t 
    = new Teacher("Name",22);
      Teacher m 
    = (Teacher)t.clone();
      System.out.println(m);
      
      Student stu 
    = new Student();
      Student deepcloneSTU 
    = (Student)stu.clone();
      stu.courses.put(
    new Integer(1),"Math");
      deepcloneSTU.courses.put(
    new Integer(100),"Java");
      disp(stu.courses);
      disp(deepcloneSTU.courses);
      
     }

     
     
    static void disp(HashMap h)
     
    {
      Set keySet 
    = h.keySet();
      Iterator it 
    = keySet.iterator();
      
    while(it.hasNext())
      
    {
       System.out.println(h.get(it.next()));
      }

     }

    }


    class Teacher implements Cloneable{
     String name;
     
    int age;
     Teacher(String name,
    int age)
     
    {
      
    this.name = name;
      
    this.age = age;
     }

     
     
    public Object clone()
     
    {
      
    try{
       
    return super.clone();
      }
    catch(CloneNotSupportedException e)
      
    {
       
    throw new Error("This should never happen!"); 
      }

     }

     
     
    public String toString()
     
    {
      
    return name + "  " + age;
     }

    }


    class Student implements Cloneable{
     HashMap courses 
    = new HashMap();
     Student()
    {} 
     
     
    public Object clone()
     
    {
      
    try{
       Student stu 
    = (Student)super.clone();
       stu.courses 
    = (HashMap)courses.clone();
       
    return stu;
      }
    catch(CloneNotSupportedException e)
      
    {
       
    throw new Error("This should never happen!"); 
      }

     }

    }




    如何通過對象串行化的方式來做進行拷貝工作呢?

    import java.util.*;
    import java.io.*;
    public class TestClone{
        
    public static void main(String[] args) throws Exception
        
    {
            BMW mycar 
    = new BMW();
            ByteArrayOutputStream memoryOutputStream 
    = new ByteArrayOutputStream();
            ObjectOutputStream serializer 
    = new ObjectOutputStream(memoryOutputStream);
            serializer.writeObject(mycar);
            serializer.flush();
            
            ByteArrayInputStream memoryInputStream 
    = new ByteArrayInputStream(memoryOutputStream.toByteArray( ));
            ObjectInputStream deserializer 
    = new ObjectInputStream(memoryInputStream);
            BMW mycopycar 
    = (BMW)deserializer.readObject();

            mycar.add(
    new String("NB"));
            mycopycar.add(
    new String("NBNB"));
          System.out.println(mycar.hashCode());
          System.out.println(mycopycar.hashCode());
          System.out.println(mycar.equals(mycopycar));
        }

    }


    class BMW implements Serializable
    {
        
    private int wheels;
      
    private String model;
      
    private ArrayList forTest;
      
      BMW()
      
    {
          wheels 
    = 4;
          model 
    = "530i";
          forTest 
    = new ArrayList();
      }

      
      
    public void add(Object o)
      
    {
          forTest.add(o);
      }

      
      
    public String toString()
      
    {
          
    return "WHEEL:" + wheels + "MODEL:" + model + forTest.toString();    
      }

      
      
    public int hashCode()
      
    {
          
    return wheels + model.hashCode() + forTest.hashCode();    
      }

      
      
    public boolean equals(Object o)
      
    {
          
    if(o == this)
              
    return true;
          
    if(o == null)
              
    return false;
          
    if(!(o instanceof BMW))
            
    return false;
          BMW bmw 
    = (BMW)o;
          
    if(bmw.wheels == wheels&&bmw.model.equals(model)&&bmw.forTest.equals(forTest))
              
    return true;
          
    else return false;
      }
      
    }


    記住,如果覆蓋了equals方法,應該也覆蓋hashCode(),因為如果兩個對象相等也就是equals()返回true,那么這兩個對象應該有相同的hashCode。



    posted on 2006-01-08 17:15 北國狼人的BloG 閱讀(3604) 評論(0)  編輯  收藏 所屬分類: 達內學習總結
    主站蜘蛛池模板: 亚洲精品美女视频| 亚洲中文字幕无码一区二区三区| 亚洲av日韩av不卡在线观看| 成人福利在线观看免费视频| 四只虎免费永久观看| 色欲色欲天天天www亚洲伊| 国产精品免费看久久久久| 精品国产亚洲AV麻豆| 亚洲国产成人久久综合野外| 视频免费1区二区三区| 亚洲综合国产精品第一页| 成在线人免费无码高潮喷水| 亚洲自偷自偷偷色无码中文| 久久久国产精品福利免费| 久久久久亚洲精品日久生情| 岛国av无码免费无禁网站| 亚洲国产精品美女久久久久| 日本不卡在线观看免费v| 一级A毛片免费观看久久精品| 亚洲综合无码精品一区二区三区| 免费人成在线观看网站| 亚洲fuli在线观看| 国产yw855.c免费视频| 久久高潮一级毛片免费| 亚洲精品成人久久| 国产在线a不卡免费视频| 久久久WWW成人免费精品| 亚洲高清在线mv| 国产又大又粗又硬又长免费| 久青草视频在线观看免费| 亚洲视频网站在线观看| 日韩毛片无码永久免费看| aa毛片免费全部播放完整| 亚洲另类春色国产精品| 亚洲av再在线观看| **一级毛片免费完整视| 精品久久久久亚洲| 亚洲精品私拍国产福利在线| 日本特黄特黄刺激大片免费| 中国一级全黄的免费观看| 亚洲综合无码一区二区痴汉|