使用克隆可以爲我們快速地構建出一個已有對象的副本,它屬於 Java 基礎的一部分,也是面試中常被問到的知識點之一。
我們本課時的面試題是,什麼是淺克隆和深克隆?如何實現克隆?
典型回答
淺克隆(Shadow Clone)是把原型對象中成員變量爲值類型的屬性都複製給克隆對象,把原型對象中成員變量爲引用類型的引用地址也複製給克隆對象,也就是原型對象中如果有成員變量爲引用對象,則此引用對象的地址是共享給原型對象和克隆對象的。
簡單來說就是淺克隆只會複製原型對象,但不會複製它所引用的對象,如下圖所示:
深克隆(Deep Clone)是將原型對象中的所有類型,無論是值類型還是引用類型,都複製一份給克隆對象,也就是說深克隆會把原型對象和原型對象所引用的對象,都複製一份給克隆對象,如下圖所示:
在 Java 語言中要實現克隆則需要實現 Cloneable 接口,並重寫 Object 類中的 clone() 方法,實現代碼如下:
public class CloneExample {
public static void main(String[] args) throws CloneNotSupportedException {
// 創建被賦值對象
People p1 = new People();
p1.setId(1);
p1.setName("Java");
// 克隆 p1 對象
People p2 = (People) p1.clone();
// 打印名稱
System.out.println("p2:" + p2.getName());
}
static class People implements Cloneable {
// 屬性