谈谈Java中的浅克隆和深克隆

2018-07-21  本文已影响0人  扑哧咳哧

先说定义:
深克隆
克隆所得对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。深克隆的是实现实际上是对对象的序列化和反序列化.要实现深克隆被克隆类以及被克隆类的引用必须实现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);
        /**
         * 
         */

    }
}

结果是什么大家可以根据上面来推出哦。

上一篇下一篇

猜你喜欢

热点阅读