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