有人問翟天臨知網查重問題,翟天臨答不知什麼是知網,進而一個人攪動北電北大兩所的聲譽的慘案。可見提一個好問題同樣重要。
閱讀一篇關于protect的文章時(原文位址https://blog.csdn.net/wangyanguiyiyang/article/details/49800493#commentBox)遇到困惑,特記錄如下:
protected 修飾的類和屬性,對于自己、本包和其子類可見 但是對于protected的成員或方法,要分子類和超類是否在同一個包中。與基類不在同一個包中的子類,隻能通路自身從基類繼承而來的受保護成員,而不能通路基類執行個體本身的受保護成員。在相同包時,protected和public是一樣的 !
同一個包下的兩個類,MyObject對象obj無法調取clone()方法,編譯不通過,報
錯誤。
示例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()方法呢?