有人问翟天临知网查重问题,翟天临答不知什么是知网,从而一个人搅动北电北大两所的声誉的惨案。可见提一个好问题同样重要。
阅读一篇关于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()方法呢?