克隆是在Java編程中非常常用的一個操作,可以實現對象的復制。但是在Java中克隆分為深克隆和淺克隆,它們有什么不同點呢?下面我們一起來看一看。
首先,我們需要知道什么是淺克隆和深克隆。
淺克隆是指只克隆了被克隆對象的基本類型和引用類型變量的引用地址。
public class ShallowClone implements Cloneable{ private int num; private String name; private StringBuilder sb; public ShallowClone(int num, String name, StringBuilder sb) { this.num = num; this.name = name; this.sb = sb; } public Object clone() { try { return super.clone(); } catch(CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
上面的代碼是一個淺克隆例子,可以看到我們只是使用了clone()方法進行克隆,并沒有對其中的引用類型變量做處理。
深克隆是指除了克隆基本類型和引用類型變量的引用地址之外,也會克隆其中的所有引用類型變量。
public class DeepClone implements Cloneable{ private int num; private String name; private StringBuilder sb; public DeepClone(int num, String name, StringBuilder sb) { this.num = num; this.name = name; this.sb = sb; } public Object clone() { try { DeepClone clone = (DeepClone)super.clone(); clone.sb = new StringBuilder(this.sb.toString()); return clone; } catch(CloneNotSupportedException e) { e.printStackTrace(); return null; } } }
上面的代碼是一個深克隆例子,可以看到我們在克隆引用類型變量時,使用了新建一個對象的方法進行復制。
深克隆的克隆過程比淺克隆更加耗時、耗空間,也更加嚴謹。而在有些情況下,如只是需要對基本類型進行克隆時,淺克隆就可以完全勝任了。
關于克隆的使用,需要格外小心,在確定需要使用克隆時,務必清楚對象內部的引用關系。