zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    
  • 相关阅读:
    1055. [HAOI2008]玩具取名【区间DP】
    BZOJ2435:[NOI2011]道路修建 (差分)
    1084. [SCOI2005]最大子矩阵【网格DP】
    1060. [ZJOI2007]时态同步【树形DP】
    1050. [HAOI2006]旅行【并查集+枚举】
    2463. [中山市选2009]谁能赢呢?【博弈论】
    luogu P1195 口袋的天空
    luogu P1162 填涂颜色
    luogu P1223 排队接水
    luogu P1331 海战
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169504.html
Copyright © 2011-2022 走看看