克隆是在Java編程中非常常用的一個(gè)操作,可以實(shí)現(xiàn)對(duì)象的復(fù)制。但是在Java中克隆分為深克隆和淺克隆,它們有什么不同點(diǎn)呢?下面我們一起來(lái)看一看。
首先,我們需要知道什么是淺克隆和深克隆。
淺克隆是指只克隆了被克隆對(duì)象的基本類型和引用類型變量的引用地址。
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; } } }
上面的代碼是一個(gè)淺克隆例子,可以看到我們只是使用了clone()方法進(jìn)行克隆,并沒(méi)有對(duì)其中的引用類型變量做處理。
深克隆是指除了克隆基本類型和引用類型變量的引用地址之外,也會(huì)克隆其中的所有引用類型變量。
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; } } }
上面的代碼是一個(gè)深克隆例子,可以看到我們?cè)诳寺∫妙愋妥兞繒r(shí),使用了新建一個(gè)對(duì)象的方法進(jìn)行復(fù)制。
深克隆的克隆過(guò)程比淺克隆更加耗時(shí)、耗空間,也更加嚴(yán)謹(jǐn)。而在有些情況下,如只是需要對(duì)基本類型進(jìn)行克隆時(shí),淺克隆就可以完全勝任了。
關(guān)于克隆的使用,需要格外小心,在確定需要使用克隆時(shí),務(wù)必清楚對(duì)象內(nèi)部的引用關(guān)系。