一、Class類的訪問權限修飾(只有兩個): java
public:能夠供全部的類訪問。 c++
默認(包訪問權限):默承認以稱爲friendly可是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++。默認的訪問權限是包級訪問權限。 程序員
即若是寫了一個類沒有寫訪問權限修飾符,那麼就是默認的訪問權限,同一個包下的類均可以訪問到,即便能夠實例化該類
(固然若是這個類不具備實例化的能力除外,好比該類沒有提供public的構造函數)。 安全
說明:
一、每一個編譯單元(類文件)都僅能有一個public class ,以後的class 不可以使用public。能夠是內部類(類內部使用),或者匿名類(一次調用或只有這個方法使用)。函數
二、public class的名稱(包含大小寫)必須和其類文件同名。
三、一個類文件(*.java)中能夠不存在public class。
這種形式的存在的場景:若是咱們在某個包內撰寫一個class,僅僅是爲了配合同包內的其餘類工做,並且
咱們不想再爲了撰寫說明文檔給客戶(不必定是現實意義的客戶,多是調用這個類的類)看而傷腦筋,並且有可能過一段時間以後 有可能會完全改變原有的作法,並徹底捨棄舊版本,以全新的版本代替。
四、class不能夠是private和protected。(除了內部類以外)
五、若是不但願那個任何產生某個class的對象,能夠將該類得全部構造函數設置成private。可是即便這樣也能夠生成該類的對象,就是class的static的成員(屬性和方法)能夠辦到。
spa
二、類成員變量的訪問權限修飾(四個):
設計
public:緊接public的屬性任何類均可以訪問到。能夠直接使用ClassName.propertyName。可是從類的封裝性上來考慮將一個類的屬性定義成public通常不多使用, orm
在定義靜態常量的時候通暢會這樣定義。如:public static final int PAGE_SIZE=10;
對象
private:只有類自己內部的方法能夠訪問類的private屬性,固然內部類也能夠訪問其外部類的private成員的。(屬性和方法) 繼承
默認(friendly):包級可見,同一個包內的類能夠訪問到這個屬性,能夠直接使用className.propertyName來訪問,可是從類的封裝性特性來講不多這樣使用類的屬性的。
protected:關鍵字所處理的是所謂「繼承」的觀念。對於同一包的其餘類,protected=默認,其它類可訪問protected.對於不一樣包的類,若是存在繼承關係,而baseClass存在protected屬性,則能夠被其自繼承,而不一樣包的其餘類 則不能訪問類的protected屬性。
三、類的成員方法的訪問權限(修飾四個):
其從語法角度來說,這寫訪問權限控制符做用於類的方法和做用於類的屬性上的效果是同樣的。
public:全部類可見。
private:只有同一類內部的方法可見,在有就是內部類也能夠訪問到。
默認(friendly):包內可見。
protected:繼承可見。
四、訪問權限存在的理由
(1). 「讓使用者沒法碰觸到他們不應碰觸的東西。」這些東西僅供類的內部機制使用。將某些成員聲明成private,對於使用者來講能夠說是一種服務,
由於這樣使用者能夠知道哪些是他關注的哪些是不重要的,不須要關注,如此從來對於使用來講下降了對使用對象認識的難度。
(2).(最終要的理由)讓程序設計者能夠更動class內部運做方式,而無須擔憂波及到客戶端程序。
(3). java的「訪問權限修飾符」賦予classes開發者極具備價值的控制能力。身爲classes開發者,若是你的任何改變能夠徹底不干擾你的使用者,你即可以安心改變你的底層實現,由於客戶端程序員沒法訪問class的這一部分。
接口或者抽象等等策略所謂的「實現隱藏」其根本緣由並非說爲了隱藏實現的代碼和思路,而是下降使用者的使用難度,以及從維護角度來講可見範圍的控制給程序維護帶來了極大的安全性。