成员的访问权限
Public: 任何人,尤其是那些要使用这个类库的客户程序员,都能访问那个紧跟在public 后面声明的成员。
默认的package: 在同一个目录里面的文件,并且都没有明确指明它是属于哪个package 的。Java 会认为这类文件是属于这个目录的“默认package”的,因此对这个目录里边的其它文件来说,它们就都是package 权限的了。
private: 除非是用这个类(包含这个成员的类)的方法,否则一律不得访问。package 里的其它类也不能访问private 成员。一个package很可能是由好几个人合作开发的,因此private 能让你根据自己的需要修改那些成员,而不用担心这么做会不会对别的类产生影响。
protected: package 里面的类,那么你只能访问原先那个package 的public 成
员。(当然如果是在同一个package 里面继承的话,那么你还可以访问package 权限的成员。)有时基类的创建者会希望派生类能访问某个成员,而其它类则不能访问。这就是protected 要做的。protected 也赋予成员package 权限——也就是说,同一个package 里的其它类也可以访问protected 元素。
为了让代码显得更有条理,可能你选用这种风格,就是将public 成员都放在类的开头,接下来是protected 成员,然后是package 权限的,最后是private 成员。这样做的好处就是,当用户从上到下读代码的时候,会先看到对他们最重要的东西(就是能在文件以外访问的public 成员)。而当他们遇到非public 成员的时候,就会知道这是类的内部实现部分,这样就可以不读下去了。
类的访问权限
注意,类不能是private(这样除了这个类自己,其它人都 protected 的。因此类只有两种访问权限:package和public。如果你不希望别人访问这个类,你可以将它的构造函数设置成 private 的,这样除你之外,没人可以创建那个类的对象。而你则可以使用一个static 方法来创建对象。下面就是一例:
class Soup {
private Soup() {}
// (1) Allow creation via static method:
public static Soup makeSoup() {
return new Soup();
}
// (2) Create a static object and return a
reference
// upon request.(The "Singleton" pattern):
private static Soup ps1 = new Soup();
public static Soup access() {
return ps1;
}
public void f() {}
}
class Sandwich { // Uses Lunch
void f() { new Lunch(); }
}
// Only one public class allowed per file:
public class Lunch {
void test() {
// Can't do this! Private constructor:
//! Soup priv1 = new Soup();
Soup priv2 = Soup.makeSoup();
Sandwich f1 = new Sandwich();
Soup.access().f();
}
} ///:~