1、要實作物件拷貝必須實作一個Cloneable接口,如果不實作這個接口就會產生一個CloneNotSupportedException異常。其實這個介面一個方法都沒有,因此這類介面常被稱為標記介面。
2、Object 中有一個clone() 方法實作了淺拷貝。對於基本資料類型的成員變量,淺拷貝會直接進行值傳遞,也就是將該屬性值複製一份給新的對象,所以基本的資料型別直接進行淺拷貝即可。
對於可變的資料型別,例如Date物件就要實現深拷貝,當然Date類別自己實作了clone()方法,而例如String類別就沒有實作clone()方法,因為String物件是不可變字符序列,在它的生命週期中沒有任何方法能修改他所在記憶體中的字元序列,不同物件中的同類屬性引用同一個String是沒有問題的。
java學習影片教學:java學習影片
範例如下:
public class Main{ public static void main(String[] args){ } } class Employee implements Cloneable{ private int id; private Date date; public Employee(){} public Employee(int id){ this.id=id; this.date=new Date(); } @Override public Employee clone() throws CloneNotSupportedException{ Object t=super.clone();//此时的object中的拷贝只是浅拷贝 Employee clone=(Employee)t; clone.date=this.data.clone();//date类实现了深拷贝,直接调用即可 return clone; } } class Mannager extends Employee{ private String name; public Mannager(){ super(); } public Mannager(String name,int id){ super(id); this.name=name; } @Override public Mannager clone(){ Employee t=super.clone();//先把id date属性复制 Mannager clone=(Mannager)t; clone.name=t.name;//String 对象直接赋值引用 return clone; } }
更多java相關文章推薦:java入門教學
以上是java物件拷貝之深拷貝與淺拷貝的詳細內容。更多資訊請關注PHP中文網其他相關文章!