為什么java要有訪問權限的控制?
訪問權限的設置和代碼的重構有關。在一個項目中,大多數的時間和金錢都投入到了代碼的維護當中。維護中一定會修改已存在的不合理的代碼。但是在重構的過程中,就出現了這樣的問題:如何保證不影響那些使用了待修改代碼的客戶端代碼的正常使用?如何知道客戶端代碼已經使用了哪些待修改的代碼?這一切就要依靠權限修飾詞來實現。通過權限修飾詞說明了哪些是客戶端代碼可以使用的,只要保證這部分代碼(我不準確的稱之為接口)不變,那么無論內部代碼如何改變,都能保證客戶端代碼的正常使用。
靜態導入: import static ,只能導入一個類中靜態的成員函數與成員變量
成員函數或者成員變量的訪問權限修飾詞:
public:公有訪問權限,表示修在任何地方都可以被訪問到
包訪問權限:又叫default訪問權限,當一個成員函數或者變量沒有被任何修飾詞修飾的時候就是包訪問權限,表示能夠被當前包的所有類訪問。有時候也叫friendly。包訪問權限可以使當前包內所有相關的類都組合起來,以使他們彼此之間可以輕松地相互作用。當一個類沒有通過package關鍵字顯示指出所處的包時,他就屬于默認包。
private:私有訪問權限,表示除了在該類能夠被訪問之外,其他所有地方都不能被訪問。通過private關鍵字修飾構造函數可以控制如何創建對象,或者控制創建對象的數量
class A
{
private A(){}
public static A getA()
{
return new A() ;
}
}
4. ?protected:繼承訪問權限,表示可以被當前包,以及該類的子類訪問。
接口與實現:
訪問權限的控制常被稱為是具體實現的隱藏。把數據和方法包裝進類,以及具體實現的隱藏常被稱為”封裝“。其結果是一個同時帶有特征和行為的數據類型。
處于兩個很重要的原因,訪問權限控制的邊界劃在數據類型的內部。第一個是要設定客戶端程序員可以使用和不可以使用的界限。可以建立自己的內部機制,而不用擔心客戶端程序員會把內部機制當作是他們可以使用的接口的一部分。第二個原因,即將接口和具體實現進行分離。(說實在的,這部分沒有看懂,尤其是邊界劃在數據類型內部,這句很疑惑。)
類的訪問權限:
public 訪問權限
包訪問權限,解釋同上
正如前面所提到的,如果沒能為類訪問權限指定一個訪問修飾符,它就會缺省得到包訪問權限。這意味著該類的對象可以由包內任何其他類來創建,但包外則是不行的。(一定要記住,相同目錄下的所有不具有明確package聲明的文件,都被視作是該目錄下缺省包的一部分。)然而,如果該類的某個static成員是public的話,則客戶端程序員仍舊可以調用該static成員,盡管他們并不能生成該類的對象
初看這一段話,很是費解,為什么一個包訪問權限的類,能夠有public static類型的成員可以在外包被訪問。于是上網詢問,經過一位前輩的指點,終于明白了什么意思。
在這段話之前還有一個例子:
//: c05: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();
}
}
這段話中所說的public static所指的就是
public static Soup access() {
return ps1;
}
可以調用該static成員,盡管他們并不能生成該類的對象,之所以不能生成該類對象,是由于構造函數私有,而且訪問是同一個包。
具體問題地址:http://segmentfault.com/q/1010000002549128
//thinking in java筆記,如果有不對的地方,還望指正^_^