美文网首页
谈谈Java中的浅克隆和深克隆

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

作者: 扑哧咳哧 | 来源:发表于2018-07-21 19:27 被阅读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);
            /**
             * 
             */
    
        }
    }
    

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

    相关文章

      网友评论

          本文标题:谈谈Java中的浅克隆和深克隆

          本文链接:https://www.haomeiwen.com/subject/rrerpftx.html