【Java學習】關於Object的clone的一些問題

1.爲何Object中clone的修飾訪問符是protected?

  首先,protected的做用是讓方法僅能被自身和子類調用。clone目的在於深拷貝,若是被拷貝的類中包含其餘類,也必須被深拷貝,以下所示函數

class Person{ int salary; String name; Date birthDate; }

然而,當咱們調用的clone函數時Object中的時,它只好保證調用此函數的類的對象被深拷貝,其包含的類的對象只是淺拷貝。這時,若是屬性中只包含基礎類型和不可被修改的類對象還好(如int和String),改變a的值並不會影響b的值。spa

class Person{ int salary; String name; Date birthDate; public static void main(String[] args){ Person a = new Person(12,"a",new Date()); Person b = a.clone(); } }

可是,當咱們改變a中birthdate的值時,b中的birthdate也會隨之改變,這顯然違背了clone的初衷。這時咱們就須要重寫clone,並將其訪問修飾符改作public,以便外部類訪問。那麼這裏就出現了第二個問題。code

 

2.爲何要實現接口Cloneable中的clone方法而不是重寫Object中的clone方法

其實上面已經給出了答案,爲了讓外部類也能訪問clone方法,咱們須要將其訪問修飾符改成public。可是若是是重寫父類的方法,其訪問修飾符不能超過有父類訪問修飾符的範圍大小,因此不可行。對象

 

一句話總結:爲了實現讓外界可訪問且保證是深拷貝的clone方法,咱們將Object的clone設置爲protected而且建立接口Cloneableblog

相關文章
相關標籤/搜索