java語言中有四種不同的限定詞,提供了四種不同的訪問權(quán)限。
1) private
類中限定為private的成員,只能被這個(gè)類本身訪問。
如果一個(gè)類的構(gòu)造方法聲明為private,則其它類不能生成該類的一個(gè)實(shí)例。
2) default
類中不加任何訪問權(quán)限限定的成員屬于缺省的(default)訪問狀態(tài),可以被這個(gè)類本身和同一個(gè)包中的類所訪問。
3) protected
類中限定為protected的成員,可以被這個(gè)類本身、它的子類(包括同一個(gè)包中以及不同包中的子類)和同一個(gè)包中的所有其他的類訪問。
4) public
類中限定為public的成員,可以被所有的類訪問。
表3-1列出了這些限定詞的作用范圍。
【表3-1】 java中類的限定詞的作用范圍比較
=============================================================
|| 同一個(gè)類 同一個(gè)包的類 不同包的子類 不同包非子類 ||
|| private * ||
|| default * * ||
|| protected * * * ||
|| public * * * * ||
=============================================================
說明:上面這個(gè)表,看起來很簡單,而且也很容易記憶,但是卻蘊(yùn)含著極為豐富的信息,可以從不同的角度來理解上面的這個(gè)表。
比如在同一個(gè)類里面時(shí),四個(gè)關(guān)鍵詞都相當(dāng)于是public,可以不在乎限定詞是什么;在同一個(gè)包里面時(shí),除了private限定詞外,所有的限定詞的作用都完全等同于public。我們經(jīng)常會(huì)思考這樣一個(gè)問題:一個(gè)類的屬性和方法是否對外可見?這個(gè)問題描述中提到的“可見”二字,當(dāng)環(huán)境為“非子類”時(shí),說白了就是我們能否通過實(shí)例化這個(gè)類后,用一個(gè)對象把這個(gè)類的這些字段或者方法給“點(diǎn)”出來,即“某對象.某屬性(或某方法)”。因?yàn)橥ǔN覀兌际窃诓煌沫h(huán)境下操作的,比如我們會(huì)import很多系統(tǒng)的包中的類,諸如“import java.awt.*;”這樣的語句,因此我們使用這些包中的類時(shí),它們對我們的可見也就僅僅局限在使用“public”限定詞修飾的屬性或方法上了,因此大家往往會(huì)誤以為只有public的東西才能點(diǎn)出來,實(shí)則不然,當(dāng)我們在同一個(gè)包中的非子類中也可以把除了private修飾的東西之外的所有屬性和方法給“點(diǎn)”出來。其實(shí)對于“點(diǎn)”這個(gè)運(yùn)算,可以分兩個(gè)角度去理解,既然能用到“點(diǎn)”操作,那就代表了我們使用的環(huán)境應(yīng)該是“非子類”,非子類又可以分為“包內(nèi)”和“非包內(nèi)”,對于“包內(nèi)”,只要不是private修飾的東西都能點(diǎn)出來;對于“非包內(nèi)”則只能是public的東西才能點(diǎn)出來;;;如果是在“子類”中操作時(shí),大家可以思考一下,我們還用“點(diǎn)”操作嗎?顯然不用了,因?yàn)樵谧宇愔?,父類中定義的東西只要可見的話都可以被你拿過來用,因此根本就用不到點(diǎn)操作,當(dāng)然這里也要分“包內(nèi)”和“非包內(nèi)”。對于default限定詞,我們不能顯示的使用它來定義屬性或方法,只要我們在定義屬性或方法的前面什么限定詞都不加,就默認(rèn)的使用了default限定詞。