java的 clone方法

weixin_34292959發表於2016-08-14

1.java語言中沒有明確提供指標的概念與用法,而實質上每個new語句返回的都是一個指標的引用,只不過在大部分情況下開發人員不需要關心如果取操作這個指標而已。

2.在java中處理基本資料型別時,都是採用按值傳遞(傳遞的是輸入引數的複製)的方式執行,除此之外的其他型別都是按值引用傳遞(傳遞的是物件的一個引用)的方式進行。除了在函式呼叫時是引用傳遞,在使用=複製時也是採用引用傳遞。

實現

package cloneDemo;

import java.util.Date;

public class Trousers implements Cloneable
{

    private int id;
    private Date productDate = new Date();

    public int getId()
    {
        return id;
    }

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

    public Date getProductDate()
    {
        return productDate;
    }

    public void setProductDate(Date productDate)
    {
        this.productDate = productDate;
    }

    private void changeDate()
    {
        this.productDate = new Date(System.currentTimeMillis() - 60 * 60 * 1000
                * 24 * 7);

    }

    public Object clone()
    {
        Trousers o = null;
        try
        {
            o = (Trousers) super.clone();
        } catch (CloneNotSupportedException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 實現深複製
        o.productDate = (Date) this.getProductDate().clone();
        return o;
    }

    public static void main(String[] args)
    {
        Trousers t = new Trousers();
        Trousers x = (Trousers) t.clone();
        x.changeDate();
        System.out.println(t.getProductDate());
        System.out.println(x.getProductDate());
    }
}

執行結果
Sun Aug 14 19:17:12 CST 2016
Sun Aug 07 19:17:12 CST 2016

 

3.當類中包含了一些物件時,就需要用到深複製了,實現方法是在對物件呼叫clone()方法完成複製後,接著對物件中的非基本型別的屬性也呼叫clone()方法,完成深複製。

淺複製:複製物件的所有變數都含有與原來物件相同的值,而所有對其他物件的引用仍然指向原來的物件。換言之,淺複製僅僅複製所考慮的物件,而不復制它所引用的物件。

深複製:在淺複製的基礎上,深複製吧複製的物件所引用的物件都複製了一邊。

 

大部分內容來自《java程式設計師面試筆試寶典》何昊等著

相關文章