學習java權限修飾符時,隨筆7.權限那張表里可以看到,被protected修飾的類成員,是可以在同包類,或者不同包的子類中訪問的,然而當使用類的clone()方法時,卻出現了方法不可見的編譯錯誤
1 Class Person implements Cloneable{ 2 } 3 4 Class Test{ 5 public void main(String [] args) throws ClontNotSupportedException{ 6 Person person =new Person(); 7 person.clone(); //Compile error (The method clone() from the type Object is not visible) 8 } 9 }
上面代碼中Test與Person在同一個包中,為何調用person.clone()會報錯呢?再看下面的代碼
1 Class Person implements Cloneable{ 2 @Override 3 protected Object clone() throws CloneNotSupportedException { 4 return super.clone(); 5 } 6 } 7 8 Class Test{ 9 public void main(String [] args) throws ClontNotSupportedException{ 10 Person person =new Person(); 11 person.clone(); //Compile succes 12 } 13 }
我們知道,clone()方法是繼承自父類Object,其方法體是 protected native Object clone() throws CloneNotSupportedException;
通過多次測試,我發現
"當父類與子類不在同一個包時(Object與Person),創建子類對象實例(person)的類(Test)如果與父類(Object)不在同一個包,受保護的成員(clone方法)是無法訪問的,如果我們在父類(Object)的包中創建測試類,同樣創建子類實例(Person),這時受保護成員則可以訪問"
"在上面第二個代碼中,我們在子類Person中重寫了受保護成員clone(),在測試類Test中編譯通過,可以訪問"
通過上面的對比,我覺得可以這樣理解,
1.子類沒有重寫受保護方法,就看作是使用的父類的方法,這樣測試類Test與父類Object是不同包的關系,所以無法調用
2.如果我們把測試類Test挪到Object所在的包,可以調用
3.如果子類Person重寫了clone方法,調用的就是子類中clone方法,子類Person與測試類Test在同一個包中,所以可以調用