• 技术文章 >java >java基础

    java浅拷贝的使用

    小妮浅浅小妮浅浅2021-01-19 16:47:20原创2249

    除了可以直接复制java中的对象,我们还可以创建新对象进行拷贝,如果只是简单的复制属性,那么这种就是浅拷贝了。需要注意的是,因为拷贝的类型不同,所以在赋值上分为值赋值和引用赋值两种。下面我们就java浅拷贝的概念、原理进行学习,然后在代码中使用浅拷贝。

    1.概念

    浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别:

    (1)如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值;

    (2)如果属性是引用类型,拷贝的就是内存地址(即复制引用但不复制引用的对象) ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

    2.原理

    如果原型对象的成员变量是值类型,将复制一份给克隆对象,也就是说在堆中拥有独立的空间;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。换句话说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。

    3.使用实例

    需要拷贝的类上实现Cloneable接口并重写其clone()方法

    class Father{
        String name;
        public Father(String name) {
            this.name=name;
        }
        @Override
        public String toString() {
            return "Father{" +
                    "name='" + name + '\'' +
                    '}';
        }
    }
    class Son implements Cloneable {
        int age;
        String name;
        Father father;
        public Son(String name,int age) {
            this.age=age;
            this.name = name;
        }
        public Son(String name,int age, Father father) {
            this.age=age;
            this.name = name;
            this.father = father;
        }
        @Override
        public String toString() {
            return "Son{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    ", father=" + father +
                    '}';
        }
        @Override
        protected Son clone() throws CloneNotSupportedException {
            return (Son) super.clone();
        }
    }
    public class test {
        public static void main(String[] args) throws CloneNotSupportedException {
            Father f=new Father("bigFather");
            Son s1 = new Son("son1",13);
            s1.father=f;
            Son s2 = s1.clone();
            
            System.out.println(s1);
            System.out.println(s2);
            System.out.println("s1==s2:"+(s1 == s2));//不相等
            System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//相等
            System.out.println();
     
            //但是他们的Father father 和String name的引用一样
            s1.age=12;
            s1.father.name="smallFather";//s1.father引用未变
            s1.name="son222";//类似 s1.name=new String("son222") 引用发生变化
            System.out.println("s1.Father==s2.Father:"+(s1.father == s2.father));//相等
            System.out.println("s1.name==s2.name:"+(s1.name == s2.name));//不相等
            System.out.println(s1);
            System.out.println(s2);
        }
    }

    以上就是java浅拷贝的使用,对于这种简单的复制方法,大家只要考虑拷贝时的数据类型就可以了。当然除了浅拷贝外,对应就出现了深拷贝,大家可以持续关注这方面的内容。

    专题推荐:java浅拷贝
    上一篇:java引用拷贝是什么 下一篇:java类实现日期的时间差

    相关文章推荐

    • java事务的类型有哪几个• java声明式事务的三种方法• java之JDBC事务的应用• java对象和json的来回转换• java引用拷贝是什么

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网