java 核心技術(shù)-12版 卷Ⅰ- 4.3.9 基于類的訪問權(quán)限
4.3.9 基于類的訪問權(quán)限
?從前面已經(jīng)知道,方法可以訪問調(diào)用這個方法的對象的私有數(shù)據(jù)。一個類的方法可以訪問這個類的所有對象的私有數(shù)據(jù),這令很多人感到奇怪。例如,下面來看用來比較兩個員工的equals 方法。
????下面是一個典型的調(diào)用:
if(harry .equals(boss)) ...
這個方法訪問harry的私有字段,這并不讓人奇怪,不過,它還訪問了boss 的私有字段。這是合法的,其原因是boss 是Employee 類型的對象,而Employee類的方法可以訪問任何Employee 類型對象的私有字段。
C++ 注釋: C++也有同樣的規(guī)則。方法可以訪問所屬類任何對象的私有特性(feature),而不僅限于隱式參數(shù)。
4.3.10 私有方法
????實(shí)現(xiàn)一個類時(shí),我們會將所有實(shí)例字段都設(shè)置為私有字段,因?yàn)楣矓?shù)據(jù)很危險(xiǎn)。不過,方法又應(yīng)該如何設(shè)置呢?盡管大多數(shù)方法都是公共的,但在某些情況下,私有方法可能很有用。有時(shí),你可能讓希望將一個計(jì)算代碼分解成若干個獨(dú)立的輔助方法。通常,這些方法不應(yīng)該成為公共接口的一部分,這是因?yàn)樗鼈兺c當(dāng)前實(shí)現(xiàn)關(guān)系非常緊密,或者需要一個特殊協(xié)議或調(diào)用次序。最好將這樣的方法實(shí)現(xiàn)為私有方法。
????在Java中,要實(shí)現(xiàn)一個私有方法,只需要將關(guān)鍵字public改為private即可。
????如果將一個方法設(shè)置為私有,倘若你改變了方法的具體實(shí)現(xiàn),并沒有義務(wù)保證這個方法依然可用。如果數(shù)據(jù)的表示發(fā)生了變化,那么這個方法可能變得更難實(shí)現(xiàn),或者不再需要;這并不重要。重點(diǎn)在于,只要方法是私有的,類的設(shè)計(jì)者就可以確信它不會在別處使用,所以可以將其刪去。如果一個方法是公共的,就不能簡單地將其刪除,因?yàn)榭赡軙衅渌a依賴這個方法。
????
4.3.11?final實(shí)例字段
????可以將實(shí)例字段定義為final 。這樣的字段必須在構(gòu)造對象時(shí)初始化。也就是說,必須確保在每一個構(gòu)造器執(zhí)行之后,這個字段的值已經(jīng)設(shè)置,并且以后不能再修改這個字段。例如,將Employee類中的name字段聲明為final,因?yàn)樵趯ο髽?gòu)造之后,這個值不會再改變,即沒有setName方法。
????
????final 修飾符對于類型為基本類型或者不可變類的字段尤其有用。(如果類中的所有方法都不會改變其對象,這樣的類就是不可變類。例如,String 類就是不可變類。)
????對于可變類,使用final修飾符可能會造成混亂。例如,考慮以下字段:
????
????它在構(gòu)造器中初始化為
final 關(guān)鍵字指示表示存儲在 evaluations 變量中的對象引用不會再指向另一個不同的StringBuild對象。不過這個對象可以更改:
????evaluations.append("abc");