object.clone使用

如何使用

  1. 实现Cloneable接口
  2. 重写Object中clone方法,定位为public
  3. 调用super.clone();
    4.实现try catch 捕获异常

clone规则

  1. 基本类型
    如果变量是基本类型,克隆的是其值比如int、float等。

  2. 对象
    如果变量是实力对象,则拷贝其地址引用,也就是说新对象和原来对象是共用实例变量的。

  3. string字符串

若变量是string字符串,拷贝其地址引用,但是在修改时,它会从字符串池中重新生成一个新的字符串,原有的对象保持不变。

public class Book implements Cloneable {

    private int id;

    private String name;

    public Book() {}

    public Book(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return (Book)super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Book book1 = new Book();
        book1.setName("基础系列1");
        Book book2 = (Book) book1.clone();

        System.out.println("图书1:" + book1.getName());
        System.out.println("图书2:" + book2.getName());

        book2.setName("基础系列2");

        System.out.println("图书1:" + book1.getName());
        System.out.println("图书2:" + book2.getName());

    }
}

深拷贝和浅拷贝

浅拷贝
  • 如果原型对象的成员变量是值类型,将复制一份给克隆对象,
  • 如果原型对象的成员变量是引用类型,则将引用类型的地址复制一份给克隆对象。也就是说原型对象和克隆对象的成员变量指向相同的内存地址
image.png
深拷贝

在深拷贝中无论值类型还是引用类型都会复制一份给克隆对象,深拷贝将原型对象的所有引用对象也复制一份给克隆对象。

image.png
image.png

你可能感兴趣的:(object.clone使用)