從Object.clone()方法,看protected權限問題


學習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在同一個包中,所以可以調用

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM