访问权限修饰符

访问权限修饰符

本系列内容主要来自TIJ,Java核心技术卷以及Java SE 8 API

介绍了Java的public、default、protected、private四种访问权限修饰符。

包访问权限 #

  • 当前包中的所有其他类对该包内的某个类的成员具有访问权限,但这并不意味着能够访问到。是否访问到还要取决于类的成员的修饰符。若类的成员也是包访问权限或者public,那才能够访问到;
  • 当前包中的所有类对这个包之外的所有非public权限的类没有访问权限;
  • 类控制着哪些代码能够访问自己的成员,具体能否访问还需要看成员的权限。

接口访问权限-public #

  • 使用public,意味着public之后声明的成员对每个人都是可用的。

你无法访问-private #

  • 使用private,意味着除了包含该成员的类之外,其他任何类都无法访问这个成员;
  • 私有构造器可以阻止继承

继承访问-protected #

  • protected也提供包访问权限,也就是说同一包内的其他类可以访问protected修饰的元素;

  • protected实际上处理的是继承的概念,试看如下例子:

     1// base class Cookie in package access.dessert
     2package access.dessert;
     3
     4public class Cookie{
     5  public Cookie(){
     6    System.out.print("Cookie constructor");
     7  }
     8  void bite(){System.out.print("bite")};
     9}
    10
    11// sub-class ChocolateChip in package access
    12package access;
    13import access.dessert.*;
    14
    15public class ChocolateChip extends Cookie{
    16  public ChocolateChip(){
    17    System.out.print("ChocolateChip constructor");
    18  }
    19  public void chomp(){
    20    // bite(); // can't access
    21  }
    22  public void static void main(String[] args){
    23    ChocolateChip x = new ChocolateChip();
    24    x.chomp;
    25  }
    26}
    27/* output:
    28Cookie constructor
    29ChocolateChip constructor
    30*///:~
    

    继承了CookieChocolateChip不和父类在同一个包下,尽管bite()具有包访问权限,ChocolateChip也无法访问bite()方法,一个可能的办法是将bite()修改为public,但是这样并不是很合适,所以我们可以使用propected来修饰bite()方法:

     1// base class Cookie in package access.dessert
     2package access.dessert;
     3
     4public class Cookie{
     5  public Cookie(){
     6    System.out.print("Cookie constructor");
     7  }
     8  protected void bite(){System.out.print("bite")};
     9}
    10
    11// sub-class ChocolateChip in package access
    12package access;
    13import access.dessert.*;
    14
    15public class ChocolateChip2 extends Cookie2{
    16  public ChocolateChip2(){
    17    System.out.print("ChocolateChip2 constructor");
    18  }
    19  public void chomp(){
    20    bite();
    21  }
    22  public void static void main(String[] args){
    23    ChocolateChip2 x = new ChocolateChip2();
    24    x.chomp;
    25  }
    26}
    27/* output:
    28Cookie constructor
    29ChocolateChip2 constructor
    30bite
    31*///:~
    

    protected 保护了继承的访问权限。