zoukankan      html  css  js  c++  java
  • 对象的深拷贝与浅拷贝

    对象的拷贝就是将一个对象的属性都拷贝到另一个有着相同类类型的对象中。

    1 浅拷贝

    如果属性是值类型,就会拷贝属性的值,如果属性是引用类型(内存地址),拷贝的就是内存地址。这种情况下,一个对象的引用类型的属性值改变,就会影响到另一个对象。

    实现方法:对象类实现Cloneable接口后,重写clone方法,在方法内部调用super.clone()。

    public class Student implements Cloneable {
    
        Father father;
        String address;
    
        TestStream(String address, String name) {
            father = new Father(name);
            address = address;
        }
    
        // 重写clone方法
        @Override
        public Object clone() {
            try {
                return super.clone();
            } catch (CloneNotSupportedException ex) {
                return null;
            }
        }
    }

    2 深拷贝

    会拷贝所有属性,并拷贝引用类型的属性指向的内存。即将对象和它所引用的对象一起拷贝,就是深拷贝。相比于浅拷贝,深拷贝速度慢,开销大。

    深拷贝后,改变被拷贝的引用类型的属性值,不会影响到拷贝后的属性值。

    实现方法:对象类实现Cloneable接口后,重写clone(),在clone方法中创建拷贝类的一个新对象。

    public class Student implements Cloneable {
    
        Father father;
        String address;
    
        TestStream(String address, String name) {
            father = new Father(name);
            address = address;
        }
    
        // 重写clone方法
        @Override
        public Object clone() {
            return new TestStream(address, father.getName());
        }
    }

    3 序列化可以实现深拷贝

    序列化可以将一个对象持久化到磁盘中,然后再反序列化到一个新的对象。(使用序列化来进行深拷贝时,必须确保对象的所有属性都是可序列化的)

    这种放是与clone相比,性能差,比较耗时,不建议使用。

    4 数组的拷贝

    String[] array = new String[]{};

    有array.clone() 和 Arrays.copyOf(array) 方法,这两个都是浅拷贝。

  • 相关阅读:
    勾股定理
    委托应用-表单的创建和编辑
    学生成绩表(输入成绩后自动算出最高、最低、平均分)
    完美拖拽(点击回放运动轨迹)
    实心图案
    微博发布
    批量删除
    数组去重的方法
    模拟垂直滚动条
    点不到的NO
  • 原文地址:https://www.cnblogs.com/mydesky2012/p/13220414.html
Copyright © 2011-2022 走看看