• Java浅克隆和深克隆


    什么是浅克隆和深克隆?

    克隆顾名思义就是,参照一个东西再做一个出来
    
    浅克隆:直接复写Object的clone()方法,默认情况下8种基本数据类型和String都会进行深克隆,另外的其他引用类型为浅克隆(浅克隆:引用指向的是同一个对象)
    深克隆:浅克隆中那另外的其他引用类型都让其变为深克隆
    

    引用类型图解

    浅克隆

    public class Main {
    
        public static void main(String[] args) throws Exception {
    
            A a = new A();
            A b = (A)a.clone();
            b.str = "....";
            b.i = 1000;
    
            System.out.println(a == b); //false 表示地址并不一样,不是同一个引用
            System.out.println(a.p == b.p); //true 表示引用类型只想的是同一个引用
            System.out.println(a.str == b.str); //false 表示地址并不一样,不是同一个引用
            System.out.println(a.i == b.i);    //false 表示地址并不一样,不是同一个引用
        }
    
    }
    
    //克隆对象需要实现Cloneable接口
    class A implements Cloneable {
        Person p = new Person("谭迪");
        String str = "hehe";
        int i = 100;
    
        //浅克隆:该方法来自于Object
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
    class Person{
        String name;
        public Person(String name) {
            this.name = name;
        }
    }
    

    深克隆

    public class Main {
    
        public static void main(String[] args) throws Exception {
    
            A a = new A();
            A b = (A)a.clone();
    
            b.str = "....";
            b.i = 1000;
            
            System.out.println(a == b);         //false
            System.out.println(a.p == b.p);     //flase
            System.out.println(a.str == b.str); //flase
            System.out.println(a.i == b.i);     //flase
        }
    
    }
    
    //克隆对象需要实现Cloneable接口
    class A implements Cloneable {
        Person p = new Person("小明");
        String str = "hehe";
        int i = 100;
    
        //深克隆:该方法来自于Object
        @Override
        protected A clone() throws CloneNotSupportedException {
            A a = (A)super.clone();
            a.p = (Person)p.clone();
            return a;
        }
    }
    
    class Person implements Cloneable{
        String name;
        public Person(String name) { this.name = name; }
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }
    
  • 相关阅读:
    有关 JavaScript 的 10 件让人费解的事情
    Apache ab介绍1
    Oracle Raw,number,varchar2... 转换
    Flex开发者需要知道的10件事
    linux命令之nice
    JavaIO复习和目录文件的复制
    使用php获取网页内容
    linux 安装sysstat使用iostat、mpstat、sar、sa
    SQL Injection 实战某基金
    ubuntu root锁屏工具
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169504.html
Copyright © 2020-2023  润新知