天天看點

關于protect的坑,我猜你遲早會踩

有人問翟天臨知網查重問題,翟天臨答不知什麼是知網,進而一個人攪動北電北大兩所的聲譽的慘案。可見提一個好問題同樣重要。

閱讀一篇關于protect的文章時(原文位址https://blog.csdn.net/wangyanguiyiyang/article/details/49800493#commentBox)遇到困惑,特記錄如下:

protected 修飾的類和屬性,對于自己、本包和其子類可見 但是對于protected的成員或方法,要分子類和超類是否在同一個包中。與基類不在同一個包中的子類,隻能通路自身從基類繼承而來的受保護成員,而不能通路基類執行個體本身的受保護成員。在相同包時,protected和public是一樣的 !

同一個包下的兩個類,MyObject對象obj無法調取clone()方法,編譯不通過,報

關于protect的坑,我猜你遲早會踩

錯誤。

示例1:

package1
class MyObject {}


package1
public class Test  {
    public static void main(String[] args) throws CloneNotSupportedException {
        MyObject3 obj = new MyObject3();
        obj.clone();//無法通過編譯
        Test test=new Test();
        test.clone();//可通過編譯
    }
}
           

示例2: 

package1

class MyObject extends Test{

}


package1
public class Test {
  public static void main(String[] args) {
    MyObject obj = new MyObject();
    obj.clone(); // Compile ok.
  }
}
           

示例1:一種說法是雖然MyObject與Test屬于同一個包,但受保護的clone方法來自java.lang.Object類型,而在Test中,其基類Object的受保護方法是不可見的。而Test做為相對于Object的子類,是可以通路繼承而來的屬于它自己的受保護方法的。

問題1:也就是說前者屬于Object的protect方法,後者屬于Test對象自己的方法?這樣去了解?

示例2:因為MyObject的clone方法繼承自Test,而Test做為相對于Object的子類,是可以通路繼承而來的屬于它自己的受保護方法的。

問題2:為什麼在示例2中MyObject對象可以通路clone()方法而示例1中的MyObject對象卻無法通路clone()方法呢?

繼續閱讀