0.引言
Java的訪問指示符public,protected,private,缺省可以用來修飾類和方法。
1.作用域如下
具體如下:
作用域 當前類 同一package 子孫類 其他package
public √ √ √ √
protected √ √ √ x
缺省("友好") √ √ x x
private √ x x x
2.同一個java文件里面若有多個類
(1) 每個編譯單元(文件)都只能有一個public 類。每個編譯單元有一個公共接口的概念是由那個公共類表
達出來的。根據自己的需要,它可擁有任意多個提供支撐的“友好”類。但若在一個編譯單元里使用了多個
public類,編譯器就會向我們提示一條出錯消息。(即只能有一個是public修飾,其它為缺省)
(2) 可能(但並常見)有一個編譯單元根本沒有任何公共類。此時,可按自己的意願任意指定文件名。(即可以都是缺省修飾,即無訪問指示符修飾類名)
3.若不願其他任何人訪問那個類
我們現在對於類的訪問只有兩個選擇:“友好的”或者public。若不願其他任何人訪問那個類,可將所有構建器設為private,然后用(singleton)單例模式或者靜態方法獲得此類的實例
//: Lunch.java
// Demonstrates class access specifiers.
// Make a class effectively private
// with private constructors:
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();
}
} ///:~
4.例外
同一個Java文件中,我們現在對於類的訪問只有兩個選擇:“友好的”或者public,但是如果是內部類,就可以使用protected和private來修飾。
