1. 程式人生 > >java(有關類成員變數的訪問許可權)

java(有關類成員變數的訪問許可權)

private,public,protected,預設不寫(firendly)

1、Class類的訪問許可權:
public:可以供所有的類訪問。
預設:預設可以稱為friendly但是,java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++。預設的訪問許可權是包級訪問許可權。
即如果寫了一個類沒有寫訪問許可權修飾符,那麼就是預設的訪問許可權,同一個包下的類都可以訪問到,即使可以例項化該類
(當然如果這個類不具有例項化的能力除外,比如該類沒有提供public的建構函式)。

說明:
1、每個編譯單元(類檔案)都僅能有一個public class
2、public class的名稱(包含大小寫)必須和其類檔案同名。
3、一個類檔案(*.java)中可以不存在public class。
這種形式的存在的場景:如果我們在某個包內撰寫一個class,僅僅是為了配合同包內的其他類工作,而且
我們不想再為了撰寫說明文件給客戶(不一定是現實意義的客戶,可能是呼叫這個類的類)看而傷腦筋,而且有可能過一段時間之後
有可能會徹底改變原有的做法,並完全捨棄舊版本,以全新的版本代替。
4、class不可以是private和protected。
5、如果不希望那個任何產生某個class的物件,可以將該類得所有建構函式設定成private。但是即使這樣也可以生成該類的物件,就是class的static的成員(屬性和方法)可以辦到。

2、類成員變數的訪問許可權:
public:緊接public的屬性任何類都可以訪問到。可以直接使用ClassName.propertyName。但是從類的封裝性上來考慮將一個類的屬性定義成public一般很少使用,
在定義靜態常量的時候通暢會這樣定義。如:public static final int PAGE_SIZE=10;
private:只有類本身內部的方法可以訪問類的private屬性,當然內部類也可以訪問其外部類的private成員的。(屬性和方法)
預設(friendly):包級可見,同一個包內的類可以訪問到這個屬性,可以直接使用className.propertyName來訪問,但是從類的封裝性特性來說很少這樣使用類的屬性的。
protected:關鍵字所處理的是所謂“繼承”的觀念。對於同一包的其他類,protected=預設,對於不同包的類,如果存在繼承關係,而baseClass存在protected屬性,則可以被其自繼承,而不同包的其他類
則不能訪問類的protected屬性。

3、類的成員方法的訪問許可權:
其從語法角度來講,這些訪問許可權控制符作用於類的方法和作用於類的屬性上的效果是一樣的。
public:所有類可見。
pirvate:只有同一類內部的方法可見,在有就是內部類也可以訪問到。
預設(friendly):包內可見。
protected:繼承可見。

4、訪問許可權存在的理由
1、“讓使用者無法碰觸到他們不該碰觸的東西。”這些東西僅供類的內部機制使用。將某些成員宣告成private,對於使用者來說可以說是一種服務,
因為這樣使用者可以知道哪些是他關注的哪些是不重要的,不需要關注,如此歷來對於使用來說降低了對使用物件認識的難度。
2、(最終要的理由)讓程式設計者可以更動class內部運作方式,而無須擔心波及到客戶端程式。

5、java的“訪問許可權修飾符”賦予classes開發者極具有價值的控制能力。身為classes開發者,如果你的任何改變可以完全不干擾你的使用者,
你便可以安心改變你的底層實現,因為客戶端程式設計師無法訪問class的這一部分。
通過今天學習訪問許可權的問題了解到,介面或者抽象等等策略所謂的“實現隱藏”其根本原因並不是說為了隱藏實現的程式碼和思路,而是降低使用者的使用難度,以及從維護角度來說可見範圍的控制給程式維護帶來了極大的安全性