Java中有四种访问权限,public,private,protected和包访问权限,它们是置于类中每一个成员之前的定义,无论是一个域还是一个方法,下面一一介绍。
一、包访问权限
如果不提供任何访问权限修饰词,这意味着是包访问权限。即当前包中的所有其他类对那个包访问权限的成员都有访问权限,但对于这个包之外的所有类,这个类是private的,所以处于一个编译单元中的所有类之间,都是可以互相访问的。包访问权限允许将包内所有的类组合起来,以便于它们之间可以轻松地相互访问。总的来说,取得对某成员的访问去你的途径有:
(1)将该成员设为public。
(2)通过赋予包访问权的方式,将这几个类放在同一个包下。
(3)使用继承来访问父类的public和protected成员。
(4)提供访问器(accessor)和变异器(mutator)方法,也称get/set方法。
二、public:接口访问权限
使用public关键字,就意味着public之后紧跟着的成员声明自己对每个人都是可用的。下面是一个例子:
1 package dessert; 2 3 public class cookie { 4 public cookie(){ 5 System.out.println("cookie constructor"); 6 } 7 void bite(){ 8 9 } 10 }
如果再创建一个使用这个类的程序:
1 package eat; 2 3 import dessert.cookie; 4 5 public class dinner { 6 public static void main(String[] args){ 7 cookie c = new cookie(); 8 //c.bite(); 9 } 10 }
就会发现,可以创建出cookie对象,但是不能访问到它的bite()方法,因为bite()只提供了包访问权限,在包之外是禁止访问的。
三、private:无法访问
关键词private的意思是,除了包含该成员的类外,其他的类都无法访问这个成员,处于同一个包内的其他类也是不能访问private成员的。下面是一个使用private的实例:
1 package sundae; 2 3 class sundae{ 4 private sundae(){} 5 static sundae makeSundae(){ 6 return new sundae(); 7 } 8 } 9 10 public class icecream { 11 public static void main(String[] args){ 12 //sundae s = new sundae(); 13 sundae s = sundae.makeSundae(); 14 } 15 }
这个例子告诉了我们一个private的使用场景,即阻止别人直接访问某个类的构造器来创建这个类的对象。
四、protected:继承访问权限
关键字protected处理的是使用继承的概念,protected不仅提供包访问权限,还有其他一些有趣的特性,下面是一个例子:
1 package access; 2 3 public class cookie { 4 public cookie(){ 5 System.out.println("cookie constructor"); 6 } 7 void bite(){ 8 System.out.println("bite"); 9 } 10 }
1 package chocolate; 2 3 import access.cookie; 4 5 public class chocolatechip extends cookie{ 6 public chocolatechip(){ 7 System.out.println("chocolatechip constructor"); 8 } 9 public void chomp(){ 10 //bite(); 11 } 12 public static void main(String[] args){ 13 chocolatechip x = new chocolatechip(); 14 x.chomp(); 15 } 16 }
在这个例子中,类cookie中有方法bite(),这说明在从cookie继承来的类中也有方法bite(),但是bite()只是包访问权限,所以在chocolate中也无法访问到这个方法。但是如果将cookie类改成这样:
1 package access; 2 3 public class cookie { 4 public cookie(){ 5 System.out.println("cookie constructor"); 6 } 7 protected void bite(){ 8 System.out.println("bite"); 9 } 10 }
protected关键字的作用就体现出来了,这个关键词的使用使得,对于继承而来的其他类,也能在其他包中使用只有包访问权限的父类的域。