Java -- protected关键字

疑惑

准备面试时,突然想到这个关键字,对于我来说,这个修饰符是最少用的,剩下三个也算是经常用了,但对于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方法也就只能在这个子类内部使用;

猜你喜欢

转载自blog.csdn.net/qq_36865108/article/details/88371010