為什麼類只能使用public修飾?
首先,類只能使用public修飾是一個偽命題,應該說我們只見到過使用public修飾的類,還有一些類沒有訪問修飾符,此時訪問許可權為default。其次,類實際上分為外部類和內部類(inner class),一般的類都是外部類,內部類需要依賴外部類生成,內部類可以用各種訪問修飾符修飾。所以問題轉化成,為什麼不能使用private和protected修飾外部類?
我們知道,在Java中,訪問修飾符可以修飾類、方法、變數和構造方法。
訪問許可權由高到低有以下4種
類內部 | 本包 | 子包 | 外部包 | |
---|---|---|---|---|
public | v | v | v | v |
protected | v | v | v | x |
default | v | v | x | x |
private | v | x | x | x |
我們使用訪問修飾符去修飾類,就是為了讓類之間根據各種許可權來訪問。
假如外部類使用private修飾,則不能被其它類所訪問,這個類也就失去了意義。
假如外部類使用protected修飾,看起來與default相比,在包內可訪問的基礎上,包外的子類也可訪問。但包外想成為子類需要先繼承父類,然而無法找到該父類實際上無法繼承(先有雞還是先有蛋的問題),效果與default一致,也就沒必要存在了。
關於內部類:
內部類分為成員內部類、區域性內部類、匿名內部類和靜態內部類。
成員內部類是定義在另一個類中的類,是最普通的一種內部類。
class Circle {
double radius = 0;
public Circle(double radius) {
this.radius = radius;
}
class Draw { //內部類
public void drawSahpe() {
System.out.println("drawshape");
}
}
}
這樣看起來,類Draw像是類Circle的一個成員,Circle稱為外部類。成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。
內部類可以用private、protected、default、public修飾,使用private修飾只能在外部類內訪問。
關於介面
public interface Comparable<T>{
int compareTo(T other);
}
介面中的所有方法自動地屬於public,在介面中宣告方法時不必提供關鍵字public。
修飾構造方法
在單例設計模式中,我們使用private修飾構造方法,將構造器私有化,表示在類外部不能例項化該類。在類內部例項化後,提供一個可供外部訪問的方法,返回例項物件。
public class SingletonTest {
public static void main(String[] args) {
//測試
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.out.println(instance == instance2); // true
System.out.println("instance.hashCode=" + instance.hashCode());
System.out.println("instance2.hashCode=" + instance2.hashCode());
}
}
//餓漢式
class Singleton {
//1. 構造器私有化
private Singleton() {
}
//2.本類內部建立物件例項
private final static Singleton instance = new Singleton();
//3. 提供一個公有的靜態方法,返回例項物件
public static Singleton getInstance() {
return instance;
}