访问权限修饰符
本系列内容主要来自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*///:~
继承了
Cookie
的ChocolateChip
不和父类在同一个包下,尽管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 保护了继承的访问权限。