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來修飾。