什么是浅克隆和深克隆?
克隆顾名思义就是,参照一个东西再做一个出来
浅克隆:直接复写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();
    }
}
 
        