Java學習總結:34(對象克隆)

對象克隆

對象克隆就是對對象的複製操作,在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,由於這兩個對象佔據不同的堆內存空間,所以彼此之間不會互相影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章