在Object类中存在一个clone方法用于对象的克隆
protected native Object clone() throws CloneNotSupportedException;
此方法是实现克隆的唯一方法,所有类的对象只有调用此方法才可以进行克隆,但是此方法本身使用了protected权限,这样当不同的包产生对象是将无法调用object类中的clone方法,因此就需要子类来覆写clone方法,才可以克隆
在clone方法上抛出CloneNotSupportedException(不支持的克隆异常)。这是因为不是所有类的对象都可以被客厅,要克隆的类必须实现cloneable接口。
public interface Cloneable {
}
这个接口中没有任何方法,所以这个接口属于标识接口,用于表示一种能力
package com.oceanstar.test3;
class Book implements Cloneable{
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Bool{" +
"title='" + title + '\'' +
", price=" + price +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class CloneableDemo {
public static void main(String[] args) throws Exception {
Book a = new Book("JAVA", 20);
Book b = (Book) a.clone();
System.out.println(b.toString());
b.setTitle("Rust");
System.out.println(a.toString()); // Bool{title='JAVA', price=20.0} 没有改变A,因为B开辟了一块新空间
System.out.println(b.toString());
}
}