所有优秀的代码都是再反复重写多次,不断的改变下才变得完美。但是通常客户端程序员需求类库的的代码某些方面保持不变。而类库开发者需要完善修改类库的代码。由此产生了一个基本问题:“如何把变动的事物和保持不变的事物区分开来”。类库的消费者必须依赖他所使用的那部分的类库,并且希望在类库出现新版了,它们并不需要改写代码。从另一角度来说,类库的开发者必须有权限进行修改和改进,并确保客户代码不会因为这些改动而受到影响。
这一目标可以通过约定来达到。例如,类库开发者必须在改动类库中的类时不得删除任何现有方法,因为那样会破坏客户端程序员的代码。但是,在域(即数据成员)存在的情况下,类库开发者要怎样才能究竟都有哪些域已经被客户端程序员所调用了呢?这对于方法仅为类的实现的一部分,因此并不想让客户端程序员直接使用的情况来说同样如此。如果程序开发者想要移除旧的实现而添加新的实现时,结果将会怎样呢?改动任何一个成员都有可能破坏客户端程序员的代码。于是类库开发者会手脚被束缚,无法对任何事物进行改动。
为了解决这一问题,java提供了访问权限修饰词,供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的。
访问权限的等级,从大到小:public、protected、包访问权限(没有关键词)和private。
变量和方法的权限修饰词是这四个。
1 public:接口访问权限
使用关键字public,就意味着public之后紧跟着的成员声明自己对每个人都是可用的,
示例:
package access.dessert;
public class Cookie{
public int a;
Public Cookie(){
System.out.println("Cookie constructor");
}
void bite(){System.out.println("bite");}
}</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">package access.out;
import access.dessert.*;
public class Dinner{
public static void main(String[] args){
Cookie x = new Cookie();
x.a=6;
//x.bite(); 不能访问这个方法
}
}
输出:
Cookie constructor
Dinner类和Cookie不是同一个包下的两个类,Dinner类中创建了一个Cookie对象,并且调用了它的变量a,这是因为它 的构造器,类和变量a都是public,然而bite()访问是包访问权限,所以不能访问bite方法。2 包访问权限
默认访问权限没有任何关键字,通常指包访问权限(有时也表示成为friendly)。这就意味着当前包中的所有类对那个成员都有访问权限,但是对于这个包之外的所有类,这个成员是不能访问的。
3 protected:继承访问权限
同一个包中的类都可以访问,不同包的子类也可以访问。
4 private:你无法访问
除了包含该成员的类之外,其他任何类都无法访问这个成员。
二、类的访问权限
只能是public或包访问权限。
每个编译单元都只能有一个public类。public类的名称必须完全与包含有该编译单元文件名相同。
类既不可以是private的(这样会使得除了该类之外,其他任何类都不可以访问它)。也不可以是protected的。