我們知道,封裝將數據和處理數據的代碼連接起來。同時,封裝也提供另一個重要屬性:訪問控制(access control )。通過封裝你可以控制程序的哪一部分可以訪問類的成員。通過控制訪問,可以阻止對象的濫用。例如,通過只答應適當定義的一套方法來訪問數據,你能阻止該數據的誤用。因此,假如使用得當,可以把類創建一個“黑盒子”,雖然可以使用該類,但是它的內部機制是不公開的,不能修改。但是,本書前面創建的類可能不會完全適合這個目標。例如,考慮在第6章末尾示例的Stack類。方法push( ) 和pop() 確實為堆棧提供一個可控制的接口,這是事實,但這個接口并沒被強制執行。也就是說,程序的其他部分可以繞過這些方法而直接存取堆棧,這是可能的。當然,假如使用不當,這可能導致麻煩。本節將介紹能精確控制一個類各種各樣成員的訪問的機制。
一個成員如何被訪問取決于修改它的聲明的訪問指示符(access specifier )。java 提供一套豐富的訪問指示符。存取控制的某些方面主要和繼續或包聯系在一起(包,package,本質上是一組類)。Java 的這些訪問控制機制將在以后討論。現在,讓我們從訪問控制一個簡單的類開始。一旦你理解了訪問控制的基本原理,其他部分就比較輕易了。
Java 的訪問指示符有public (公共的,全局的)、PRivate (私有的,局部的)、和protected (受保護的)。Java 也定義了一個默認訪問級別。指示符protected僅用于繼續情況中。下面我們描述其他兩個訪問指示符。
讓我們從定義public 和private 開始。當一個類成員被public 指示符修飾時,該成員可以被你的程序中的任何其他代碼訪問。當一個類成員被指定為private 時,該成員只能被它的類中的其他成員訪問。現在你能理解為什么main( ) 總是被public 指示符修飾。它被在程序外面的代碼調用,也就是由Java 運行系統調用。假如不使用訪問指示符,該類成員的默認訪問設置為在它自己的包內為public ,但是在它的包以外不能被存取(包將在以后的章節中討論)。
到目前為止,我們開發的類的所有成員都使用了默認訪問模式,它實質上是public 。然而,這并不是你想要的典型的方式。通常,你想要對類數據成員的訪問加以限制,只答應通過方法來訪問它。另外,有時你想把一個方法定義為類的一個私有的方法。
訪問指示符位于成員類型的其他說明的前面。也就是說,成員聲明語句必須以訪問指示符開頭。下面是一個例子:
public int i;
private double j;
private int myMethod(int a,char b) { // ...
要理解public 和private 對訪問的作用,看下面的程序:
/* This program demonstrates the difference between
public and private.
*/
class Test {
int a; // default access
public int b; // public access
private int c; // private access
// methods to access c
void setc(int i) { // set c's value
c = i; }
int getc() { // get c's value
return c;
}
}
class AccessTest {
public static void main(String args[]) {
Test ob = new Test();
// These are OK,a and b may be accessed directlyob.a = 10;ob.b = 20;
// This is not OK and will cause an error
// ob.c = 100; // Error!
新聞熱點
疑難解答