关于protected 修饰符你不曾注意到的地方

不知道大家有没有遇到这样一种问题,新建一个对象,输入点的时候有时候有clone 方法,有的时候又没有.



通过两张图对比我们发现前者没有Object 里的protected 的clone 方法,后者却有,这个问题你们曾经考虑过没?

首先我们还是回想下protected 是怎么描述的:

1. protected 访问控制符能被用于方法和成员变量。 
2. 声明为protected 的方法和成员变量能被同一个包里的所有类所访问,

就像默认修饰符package 一样。 
    3. 能被该类的子类所访问,子类可以和父类不在一个包中。
       

      我们还是先解释第二个为什么能访问: 因为Test1 是继承Test,Test 继承Object,符合上述第三条,所以能访问clone 方法。


       第一个不能访问是因为i 变量虽然是Integer类型,而且Integer最终也是从Object 那继承来的,但是这个i 是在Integer

内的外部了,也就是说i在子类(Integer) 之外了,所以当然不能访问Object 的protected 修饰符方法了.

再说严格一点,就算Integer里有protected 的方法,在Integer类外编写它的实例再点出方法来,你也看不到protected

        方法,判断依据你这个实例超出了范围,不在Integer 内,所以你不能在类外访问类里面的protected 方法。

那如果Integer里有个测试public static void main() 方法,再写Integer i=new Integer(1);

这个时候i. 的时候会显示clone 方法.


最后我们来用官方的话语说明下为什么在Test1内里定义Integer i=new Integer(1);

i.clone()方法是不可见的?

原因如下:

1. 这个i 的类型Integer 与Test1 不属于同一个包;

2. Integer 与类Test1 也不是继承关系;

3. i 是在Integer 类的外部,因此不能访问protected 属性的成员或方法。



猜你喜欢

转载自blog.csdn.net/yunjie167/article/details/78129191