针对类内每个成员的每个定义,Java 访问指示符 poublic,protected 以及private都置于它们的最前面――无论它们是一个数据成员,还是一个方法。每个访问指示符都只控制着对那个特定定义的访问。
1.friendly
如果根本不指定访问指示符,默认的访问没有关键字,但它通常称为“友好”(Friendly)访问。这意味着当前包内的其他所有类都能访问“友好的”成员,但对包外的所有类来说,这些成员却是“私有”(Private)的,外界不得访问。由于一个编译单元(一个文件)只能从属于单个包,所以单个编译单元内的所有类相互间都是自动“友好”的。因此,我们也说友好元素拥有“包访问”权限。
2.public
使用public关键字时,它意味着紧随在public 后面的成员声明适用于所有人。
示例:
包c05.dessert中创建一个Cookie类
//: Cookie.java // Creates a library package c05.dessert; public class Cookie { public Cookie() { System.out.println("Cookie constructor"); } void foo() { System.out.println("foo"); } }
再创建一个Dinner类,导入上面的dessert包
//: Dinner.java // Uses the library import c05.dessert.*; public class Dinner { public Dinner() { System.out.println("Dinner constructor"); } public static void main(String[] args) { Cookie x = new Cookie(); //! x.foo(); // Can't access } }
可以创建一个Cookie对象,因为它的构建器是 public的,而且类也是 public的(公共类的概念稍后还会进行更详细的讲述)。然而,foo()成员不可在 Dinner.java 内访问,因为foo()只有在 dessert包内才是“友好”的。
默认包:如果多个文件位于同一个目录下面,并且没有明确的包名,java就认为他们是一个默 认包,就可以互相访问了。
3.private
private关键字意味着除非那个特定的类,而且从那个类的方法里,否则没有人能访问那个成员。
同一个包内的其他成员不能访问 private成员,这使其显得似乎将类与我们自己都隔离起来。
默认的“友好”包访问通常已经是一种适当的隐藏方法;请记住,对于包的用户来说,是不
能访问一个“友好”成员的。这种效果往往能令人满意,因为默认访问是我们通常采用的方 法。对于希望变成public(公共)的成员,我们通常明确地指出,令其可由客户程序员自由调用。
private 有非常重要的用途,特别是在涉及多线程处理的时候。
此时还会产生另一个影响:由于默认构建器是唯一获得定义的,而且它的属性是 private,所以可 防止对这个类的继承。
4.protected
protected 关键字为我们引入了一种名为“继承”的概念,它以现有的类为基础,并在其中加 入新的成员,同时不会对现有的类产生影响――我们将这种现有的类称为“基础类”或者“基 本类”(Base Class)。
若新建一个包,并从另一个包内的某个类里继承,则唯一能够访问的成员就是原来那个包的public 成员。当然,如果在相同的包里进行继承,那么继承获得的包能够访问所有“友好”的成员。 有些时候,基础类的创建者喜欢提供一个特殊的成员,并允许访问衍生类。这正是protected 的工作。
*为获得对一个类或成员变量的访问权限,唯一的方法就是:
(1) 使成员成为“public”(公共的)。这样所有人从任何地方都可以访问它。
(2) 变成一个“友好”成员,方法是舍弃所有访问指示符,并将其类置于相同的包内。这样一 来,其他类就可以访问成员。
(3) 正如以后引入“继承”概念后大家会知道的那样,一个继承的类既可以访问一个 protected 成员,也可以访问一个 public成员(但不可访问 private成员)。只有在两个类位于相同 的包内时,它才可以访问友好成员。但现在不必关心这方面的问题。
(4) 提供“访问器/变化器”方法(亦称为“获取/设置”方法),以便读取和修改值。这是 OOP环境中最正规的一种方法,也是 Java Beans的基础。