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();
        }
    }
    
  • 相关阅读:
    记录一次win10最大的bug
    Spring事务处理知识点
    ubuntu系统上安装docker
    Java抽象方法、接口、访问修饰符、访问权限笔记
    java牛客刷题2020年10月2日
    牛客错题2020年9月30日
    牛客错题2020年9月29日
    牛客刷题2020年9月27日
    java牛客刷题2020年9月21日
    java牛客刷题2020年9月20日
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8169504.html
Copyright © 2011-2022 走看看