object.clone使用
2020-04-26 本文已影响0人
Android_冯星
如何使用
- 实现Cloneable接口
- 重写Object中clone方法,定位为public
- 调用super.clone();
4.实现try catch 捕获异常
clone规则
-
基本类型
如果变量是基本类型,克隆的是其值比如int、float等。 -
对象
如果变量是实力对象,则拷贝其地址引用,也就是说新对象和原来对象是共用实例变量的。 -
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