我們知道,封裝將數(shù)據(jù)和處理數(shù)據(jù)的代碼連接起來。同時,封裝也提供另一個重要屬性:訪問控制(access control )。通過封裝你可以控制程序的哪一部分可以訪問類的成員。通過控制訪問,可以阻止對象的濫用。例如,通過只答應(yīng)適當(dāng)定義的一套方法來訪問數(shù)據(jù),你能阻止該數(shù)據(jù)的誤用。因此,假如使用得當(dāng),可以把類創(chuàng)建一個“黑盒子”,雖然可以使用該類,但是它的內(nèi)部機(jī)制是不公開的,不能修改。但是,本書前面創(chuàng)建的類可能不會完全適合這個目標(biāo)。例如,考慮在第6章末尾示例的Stack類。方法push( ) 和pop() 確實(shí)為堆棧提供一個可控制的接口,這是事實(shí),但這個接口并沒被強(qiáng)制執(zhí)行。也就是說,程序的其他部分可以繞過這些方法而直接存取堆棧,這是可能的。當(dāng)然,假如使用不當(dāng),這可能導(dǎo)致麻煩。本節(jié)將介紹能精確控制一個類各種各樣成員的訪問的機(jī)制。
一個成員如何被訪問取決于修改它的聲明的訪問指示符(access specifier )。java 提供一套豐富的訪問指示符。存取控制的某些方面主要和繼續(xù)或包聯(lián)系在一起(包,package,本質(zhì)上是一組類)。Java 的這些訪問控制機(jī)制將在以后討論?,F(xiàn)在,讓我們從訪問控制一個簡單的類開始。一旦你理解了訪問控制的基本原理,其他部分就比較輕易了。
Java 的訪問指示符有public (公共的,全局的)、PRivate (私有的,局部的)、和protected (受保護(hù)的)。Java 也定義了一個默認(rèn)訪問級別。指示符protected僅用于繼續(xù)情況中。下面我們描述其他兩個訪問指示符。
讓我們從定義public 和private 開始。當(dāng)一個類成員被public 指示符修飾時,該成員可以被你的程序中的任何其他代碼訪問。當(dāng)一個類成員被指定為private 時,該成員只能被它的類中的其他成員訪問?,F(xiàn)在你能理解為什么main( ) 總是被public 指示符修飾。它被在程序外面的代碼調(diào)用,也就是由Java 運(yùn)行系統(tǒng)調(diào)用。假如不使用訪問指示符,該類成員的默認(rèn)訪問設(shè)置為在它自己的包內(nèi)為public ,但是在它的包以外不能被存?。ò鼘⒃谝院蟮恼鹿?jié)中討論)。
到目前為止,我們開發(fā)的類的所有成員都使用了默認(rèn)訪問模式,它實(shí)質(zhì)上是public 。然而,這并不是你想要的典型的方式。通常,你想要對類數(shù)據(jù)成員的訪問加以限制,只答應(yīng)通過方法來訪問它。另外,有時你想把一個方法定義為類的一個私有的方法。
訪問指示符位于成員類型的其他說明的前面。也就是說,成員聲明語句必須以訪問指示符開頭。下面是一個例子:
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!
新聞熱點(diǎn)
疑難解答