zoukankan      html  css  js  c++  java
  • java--clone浅拷贝和深拷贝

    浅拷贝和深拷贝概念:

    浅拷贝和深拷贝都是针对一个已有对象的操作。那先来看看浅拷贝和深拷贝的概念。

    在 Java 中,除了基本数据类型(元类型)之外,还存在 类的实例对象 这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。

    而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。

    所以到现在,就应该了解了,所谓的浅拷贝和深拷贝,只是在拷贝对象的时候,对 类的实例对象 这种引用数据类型的不同操作而已。

    总结来说:

    1、浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。

    2、深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

    拷贝实现:

    实现Cloneable接口,否则报java.lang.CloneNotSupportedException错误。

    重写Object中的clone()方法,并把该方法访问修饰符改为public。

    浅拷贝实现:

    public class Book implements Cloneable{
        private String name;
        private String[] authors;
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    //getter()、setter()。。。
    }
    import java.util.Arrays;
    public class Test {
        public static void main(String[] args) throws CloneNotSupportedException {
            Book book = new Book();
            book.setName("Think in Java");
            book.setAuthors(new String[]{"Alpha", "Mike"});
            Book cloneBook = (Book) book.clone();
            System.out.println("clone object[name="+cloneBook.getName()+"," +
                    "authors="+ Arrays.toString(cloneBook.getAuthors())+"]");
            System.out.println("引用对象是否是同一个:"+(book.getAuthors()==cloneBook.getAuthors()));
        }
    }

    测试结果:

    clone object[name=Think in Java,authors=[Alpha, Mike]]
    引用对象是否是同一个:true

    深拷贝实现:

    public class Book implements Cloneable{
        private String name;
        private String[] authors;
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            Book cloneBook= (Book) super.clone();
            //引用对象也拷贝一下
            cloneBook.authors=this.authors.clone();
            return cloneBook;
        }
    //getter()、setter()。。。
    }

    测试类:

    import java.util.Arrays;
    public class Test {
        public static void main(String[] args) throws CloneNotSupportedException {
            Book book = new Book();
            book.setName("Think in Java");
            book.setAuthors(new String[]{"Alpha", "Mike"});
            Book cloneBook = (Book) book.clone();
            System.out.println("clone object[name="+cloneBook.getName()+"," +
                    "authors="+ Arrays.toString(cloneBook.getAuthors())+"]");
            System.out.println("引用对象是否是同一个:"+(book.getAuthors()==cloneBook.getAuthors()));
        }
    }

    测试结果:

    clone object[name=Think in Java,authors=[Alpha, Mike]]
    引用对象是否是同一个:false
  • 相关阅读:
    拟真世界精密驾驶挑战 《微软飞行模拟》新截图放出
    抖音“统治”美国年轻人
    Google Play商店为预注册的游戏和应用提供自动安装功能
    小米Note 10 Lite海外发布 无缘中国市场
    亚马逊允许数万名员工在家工作直到10月2日
    刷新 翻看 我 关注 实时 疫情 何时彻底“解封”?王辰院士:北京防疫未到松懈时
    “胡汉三”饰演者刘江今晨去世,享年95岁
    虎牙年报披露2019年扭亏为盈,腾讯操持下与斗鱼合并倒计时?
    微软宣布一批新获得Microsoft Teams认证的会议硬件
    美版健康码要来了!苹果Google被网友质疑:这是变相的监视系统吗?
  • 原文地址:https://www.cnblogs.com/jvStarBlog/p/11141048.html
Copyright © 2011-2022 走看看