訪問控制符的作用是說明被聲明的內容(類、屬性、方法和構造方法)的訪問權限,就像發布的文件一樣,在文件中標注機密,就是說明該文件可以被那些人閱讀。
訪問控制在面向對象技術中處於很重要的地位,合理的使用訪問控制符,可以通過降低類和類之間的耦合性(關聯性)來降低整個項目的復雜度,也便於整個項目的開發和維護。具體的實現就是通過訪問控制符將類中會被其它類調用的內容開放出來,而把不希望別人調用的內容隱藏起來,這樣一個類開放的信息變得比較有限,從而降低了整個項目開放的信息,另外因為不被別人調用的功能被隱藏起來,在修改類內部隱藏的內容時,只要最終的功能沒有改變,即使改變功能的實現方式,項目中其它的類不需要更改,這樣可以提高了代碼的可維護性,便於項目代碼的修改。
在Java語言中訪問控制權限有4種,使用三個關鍵字進行表達,依次如下:
l public——公共的
l protected——受保護的
l 無訪問控制符——默認的
l private——私有的
其中無訪問控制符是指不書寫任何的關鍵字,也代表一種訪問權限,訪問控制符的使用示例如下所示:
public class AccessControl {
int n;
public AccessControl(){
init();
}
private void init(){}
protected void test(int k){}
}
該示例代碼中演示了各個訪問控制符的實際使用示例,其中屬性n的訪問控制符就是默認的。
在實際使用時,類聲明的訪問控制符只有2個:public和無訪問控制符,屬性聲明、構造方法聲明和方法聲明的訪問控制符可以是以上4種中的任何一個。
這4個訪問控制符的權限作用如下表所示:
訪問控制符 同一個類內部 同一個包內部 不同包中的子類 不同包中的非子類 public Yes Yes Yes Yes protected Yes Yes Yes No 無訪問控制符 Yes Yes No No private Yes No No No
說明:在該表中,Yes代表具備對應的權限,No代表不具備對應的權限。
在4種訪問控制中,public一般稱作公共權限,其限制最小,也可以說沒有限制,使用public修飾的內容可以在其它所有位置訪問,只要能訪問到對應的類,就可以訪問到類內部public修飾的內容,一般在項目中開放的方法和構造方法使用public修飾,開放給項目使用的類也使用public修飾。protected一般稱作繼承權限,使用protected修飾的內容可以被同一個包中的類訪問也可以在不同包內部的子類中訪問,一般用於修飾只開放給子類的屬性、方法和構造方法。無訪問控制符一般稱作包權限,無訪問控制符修飾的內容可以被同一個包中的類訪問,一般用於修飾項目中一個包內部的功能類,這些類的功能只是輔助其它的類實現,而為包外部的類提供功能。private一般稱作私有權限,其限制最大,類似於文件中的絕密,使用private修飾的內容只能在當前類中訪問,而不能被類外部的任何內容訪問,一般修飾不開放給外部使用的內容,修改private的內容一般對外部的實現沒有影響。
下面以兩個基本的示例來說明訪問控制符在實際項目中的使用方式。
第一個使用示例:在項目中,一般不會將類的屬性開放給其它的類,也就是不允許外部的類直接訪問屬性,而是使用對應的存取方法來進行訪問。例如在學校的學員管理系統中,需要實現的學生類,按照訪問控制符的一般使用規則,實現的代碼如下:
/**
* 學員類,演示訪問控制符的使用
*/
public class Student {
/**年齡*/
private int age;
/**學員ID*/
private int id;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 0){
//處理代碼,未實現
}
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
//校驗id是否合法的代碼,未實現
this.id = id;
}
}
通過將屬性的訪問權限設定為private,限制所有類外部對屬性的訪問,而為了讓外部可以訪問這些屬性,專門聲明對應的get/set方法來讀取/存儲數據,這樣在設置屬性值的set方法中,可以對於參數做出基本的校驗,在上面的示例代碼中,留出了校驗參數的位置,具體的代碼未在示例代碼中實現。
小技巧:在eclipse中,get和set方法可以在選中對應類的代碼以後,使用“Source”菜單中的“Generate Getters and Setters…”菜單實現。
第二個使用示例:在項目中,一般為了設計的需要實現一些特定的功能,下面介紹一下使用訪問控制符實現的一個功能——使一個類既不能創建對象也不能被繼承。實現的方法如下:該類中只實現一個構造方法,而且將該構造方法的訪問權限設置為私有的。具體實現代碼如下:
/**
* 不能創建對象且不能被繼承的子類
*/
public class PrivateDemo {
private PrivateDemo(){}
}
在該示例中,PrivateDemo類只有一個構造方法,且該構造方法為私有。按照以前的介紹,創建對象時需要調用構造方法,而private修飾的構造方法無法在類的外部進行訪問,所以無法創建對象。另外,在子類的構造方法中也需要調用父類的構造方法,由於private的構造方法無法得到調用,所以該類也不可以有對應的子類。
這裡說明的只是兩個基本的用途,在實際的項目中,可以根據需要靈活的使用訪問控制符實現對應的功能。
總之,訪問控制符通過控制聲明的內容的訪問權限,實現對於內容的隱藏,從而降低使代碼的耦合性降低,降低項目的復雜度,並且方便實際項目中代碼的維護。