Javaでの浅いクローンと深いクローンについて

2480 ワード

定義:クローンを深くクローン化したオブジェクトのすべての変数には、元のオブジェクトと同じ値が含まれており、他のオブジェクトを参照する変数が除去されます.他のオブジェクトを参照する変数は、元の参照オブジェクトではなく、コピーされた新しいオブジェクトを指します.深いクローンは、実际にはオブジェクトのシーケンス化と逆シーケンス化を実现します.深いクローンのクローン化されたクラスとクローン化されたクラスの参照を実现するには、Serializableインタフェースを実现する必要があります.そうしないと、NotSerializableException例外が放出されます.
浅いクローンクローンで得られたすべての変数には、元のオブジェクトと同じ値が含まれていますが、他のオブジェクトへの参照はすべて元のオブジェクトを指します.浅いクローンがクローンされたクラスを実現するにはCloneableインタフェースを実現する必要がある.
復習:    値のタイプは次のとおりです.        1,整数タイプ(byte,short,int,long)        2,浮動小数点タイプ(float,double)        3,ブールタイプ(boolean)        4,文字タイプ(char)    値タイプ以外は参照値タイプです.参照値タイプは次のとおりです.        1,クラスタイプ(class)        2、配列        3,インタフェースタイプ(interface)文字列は参照タイプであるが,関数パラメータによって文字列参照の値を変更しても元の参照値は変更されないことに注意する.
public class Self implements Cloneable, Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    int a = 0;
    String b = "this is Self ";
    
    //   
    public Object clone() throws CloneNotSupportedException {
        Self s = (Self) super.clone();
        return s;
    }
    
    //   
    public Object deepClone() throws IOException, ClassNotFoundException {
        
        //           
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        
        //          ,  
        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }
}
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Self s = new Self();
        
        //       
        Self s_from_shallow = null;
        try {
            s_from_shallow = (Self) s.clone();
        } catch (CloneNotSupportedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        
        //       
        Self s_from_deep = null;
        try {
            s_from_deep = (Self) s.deepClone();
        } catch (ClassNotFoundException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        //                        
        System.out.println(s.b == s_from_deep.b);
        System.out.println(s.b == s_from_shallow.b);
        /**
         * 
         */

    }
}

結果は何なのか、上から出してもいいですよ.