疑惑
准备面试时,突然想到这个关键字,对于我来说,这个修饰符是最少用的,剩下三个也算是经常用了,但对于protected是真的不熟悉,今天看了详解,还是很懵,多看了几遍,
解惑
先看一般的介绍被 protected 修饰的成员对于本包和其子类可见
,其实要分多种情况
- 先我觉得需要解释一下什么叫可见,并没有严格的定义,但是从我对一些示例的总结,可以看出点端倪,在我的理解中,可见是指调用处,什么意思呢,比如说菜鸟教程上的这段代码:
package p1;
public class Father1 {
protected void f() {} // 父类Father1中的protected方法
}
package p1;
public class Son1 extends Father1 {}
package p11;
public class Son11 extends Father1{}
package p1;
public class Test1 {
public static void main(String[] args) {
Son1 son1 = new Son1();
son1.f(); // Compile OK ----(1)
son1.clone(); // Compile Error ----(2)
Son11 son = new Son11();
son11.f(); // Compile OK ----(3)
son11.clone(); // Compile Error ----(4)
}
}
-
先说f()方法,这个方法是父类声明的protected方法,按上面的理说,这个方法是p1包和所有子类可以调用的,这里的两个子类的调用之所以可以成功,完全是因为Test1这个类是在p1包下,而不是因为调用f()方法的是Father1的子类实例,如果你把Test1移到p11下,你会发现f()方法无法调用,
-
然后说clone()方法,这个方法是Object类下的protected,如果按包可见来说,这个方法只能在java.lang.*下调用,事实也确实是这样的,因为代码中的(2)(4)就无法调用,但是如果你在两个子类内部调用父类的这个方法,就可以调用,无论这两个类在哪;
-
属性(成员变量) : 父类的protected成员是包内可见的,对子类可见
-
方法 : 其实上面都说完了,就是如果一个类没有子类,那么这个类的protected方法就只能在这个类所在包下的类中被调用,如果这个方法有子类,那么这个子类继承父类的protected方法也就只能在这个子类内部使用;