<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

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

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

    Student類的clone方法就是深拷貝。注意super.clone返回的對象實際上是被類的對象,可以放心強制轉換,至于為什么,我也不知道,估計得讀虛擬機規(guī)范,從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)  編輯  收藏 所屬分類: 達內(nèi)學習總結
    主站蜘蛛池模板: 最好2018中文免费视频| 二区久久国产乱子伦免费精品| 国产特级淫片免费看| 色哟哟国产精品免费观看| 亚洲AV永久无码精品水牛影视| 国产高清免费视频| 成a人片亚洲日本久久| 亚洲国产精品久久66| 日韩电影免费在线| 免费观看一区二区三区| 亚洲永久网址在线观看| 亚洲精品无码成人片久久| 久久电影网午夜鲁丝片免费| fc2免费人成在线视频| ass亚洲**毛茸茸pics| 久久亚洲中文字幕精品一区四 | 中国一级特黄高清免费的大片中国一级黄色片 | 国产免费怕怕免费视频观看| 国产在线精品免费aaa片| 亚洲国产精品无码久久九九大片 | 日韩av无码免费播放| 亚洲人成网站18禁止| 亚洲国产精品自在线一区二区 | 亚洲精品国产福利一二区| 国产在线jyzzjyzz免费麻豆| 尤物视频在线免费观看| ww亚洲ww在线观看国产| 亚洲精品~无码抽插| 精品国产麻豆免费网站| 永久在线免费观看| 国产高清对白在线观看免费91 | 十八禁无码免费网站| 又大又硬又粗又黄的视频免费看| 亚洲人成网站在线观看播放动漫| 亚洲第一区在线观看| 韩国二级毛片免费播放| 国产精品1024永久免费视频 | 亚洲精品WWW久久久久久| 免费毛片在线视频| 无码乱肉视频免费大全合集| 一级毛片免费观看不卡视频|