對象克隆
對象克隆就是對對象的複製操作,在Object類中存在一個clone()方法用於對象的克隆操作。該方法如下:
protected Object clone() throws CloneNotSupportedException;
我們注意到:
1.此方法使用了protected訪問權限,這樣使得在不同包產生對象時將無法調用Object類中的clone()方法,因此需要子類來覆寫clone()方法,纔可以正常完成克隆操作;
2.clone()方法上拋出了一個“CloneNotSupportedException”(不支持的克隆異常),這是因爲不是所有類的對象都可以被克隆,所以在Java中爲了區分哪些對象可以被克隆,專門提供了一個Cloneable接口,要克隆對象的類必須實現Cloneable接口。
注:Cloneable接口沒有任何方法,這個接口屬於標識接口。
關於標識接口:標識接口是沒有任何方法和屬性的接口。標識接口不對實現它的類有任何語義上的要求,它僅僅表明實現它的類屬於一個特定的類型。
例:實現克隆操作
package Project.Study.ObjectCloning;
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 "書名:"+this.title+",價格:"+this.price;
}
//由於此類需要對象克隆操作,所以才需要進行方法的覆寫
@Override
public Object clone() throws CloneNotSupportedException{
return super.clone(); //調用父類的克隆方法
}
}
public class Test1 {
public static void main(String[]args) throws Exception {
Book book1=new Book("Java",79); //實例化對象
Book book2=(Book)book1.clone(); //克隆對象,開闢新的堆內存空間
book2.setTitle("C++"); //修改克隆對象屬性,不影響其他對象
System.out.println(book1);
System.out.println(book2);
}
}
//結果:
//書名:Java,價格:79.0
//書名:C++,價格:79.0(克隆對象)
上程序利用book1對象的內容克隆出一個新的Book類對象book2,由於這兩個對象佔據不同的堆內存空間,所以彼此之間不會互相影響。