Java編程思想之6訪問權限控制

這一章比較簡單。

封裝

以前開始學面向對象編程的時候,就開始背:封裝繼承多態。有一次面試的時候,人家問我:封裝的目的是什麼??我居然答不上來。

這一章的名字是:訪問權限的控制,開始的時候,我都想跳過這一章不讀了。感覺沒什麼意思,就是 public  protected  private 嘛。讀了兩遍後,才感覺到,這一章其實是比較重要的,雖然它比較簡單。

我感覺很多書都會把這一章的題目叫做:封裝。 因爲前面是把基本語法講完了。這一章開始面向對象了,第一個就自然是封裝了。但爲什麼這麼偉大的一本書,就把這一章叫做了:訪問權限的控制。  我感覺原因是,這纔是封裝的本質,比封裝這兩個字更能說明這個特性。根據120頁的定義:把數據和方法包裝進類中,以及具體實現的隱藏叫做封裝。數據和方法包裝到類裏面,這個我們大家都知道的。這個應該也是非常重要的,因爲面向對象編程有一項優勢就是這個,這樣更適合定義問題空間。而更重要的是具體實現的隱藏,因爲編寫軟件一直以來都是想要代碼複用,易修改,易擴展。包括最最經典的設計模式,也是有一個基本的原則:將變化的部分和不變的部分分開。所以,如果能將具體的實現隱藏,只留給使用代碼的人(客戶端)必要的接口,這樣就比較容易代碼修改了。只要是private方法,我就可以隨意修改。訪問權限的控制,提供了一個邊界,一部分接口(公共方法)是讓外界程序員調用的,一部分方法是輔助方法,是輔助那些公共方法的。輔助方法一般僅僅是自己用,就可以容易修改了,而不用擔心是否已經有客戶使用了這個方法。這便是這一章最主要的內容了。訪問權限的控制 和 具體實現的隱藏實際是一個東西。另外,封裝能使得代碼更容易維持不變性條件。

任何一門語言都是智慧的結晶。像Java這樣的偉大的語言,更是許多計算機天才智慧的結晶。  因此,任何一個語言特性都有它出現的道理,不可能是哪個科學家隨意添加的。就像前面的封裝一樣,它是那麼的重要,有了這個特性,就可以讓計算機語言更適合描述問題(數據和方法包裝在一起),有了這個特性就更容易的實現代碼的修改代碼的複用(訪問權限的控制),所以Java一定要支持這個特性。

包的出現也不是憑空的最開始的C語言,沒有這個類似的概念,沒有這個類似的特性。那麼就很容易出現命名的衝突,你定義了一個f()方法,我也定義了一個f()方法。咱們兩個代碼整合時,就很容易發生衝突。C++接受了這個教訓,就有了命名空間這個特性。Java沿用了這個特性。有了它,就不容易產生類名的衝突了。你可以寫一個Student類,我也可以寫一個Student類,只要它們在不同的包,就可以共存於同一個項目。另外,如果你想要發佈代碼,讓別人都可以用的話,就最好有一個獨一無二的包名。

一個.java文件,只能有一個Public類,這個類的名字需要跟文件名相同爲什麼要有這個特性呢????這其實是很自然的,首先方便程序員瀏覽,看看類文件名就知道這裏面是哪個類。其次,我感覺也方便虛擬機去加載類。只要根據文件名和路徑就可以找到對應的類。 代碼重構上講:要儘量暴露你的目的,代碼其實是最好的註釋,取一個合適恰當的名字,就是最好的註釋了。所以,文件名就是爲了暴露這個文件裏面的主類的功能的。可以很方便的讓別的程序員瞭解代碼。  一個.java文件除了這個public類之外,還有一些輔助類,爲什麼要搞的這麼複雜???,不要煩躁。確實,沒有這個特性確實學起來簡單了一點。每個java文件都知包含一個public類,整個代碼很清晰。但是存在就有它的道理。一個public類如果獨自完成它的全部功能,有時後會感覺比較吃力,代碼比較亂。可以把功能分成幾個小功能。讓不同的類去實現。但是,這些類,我又不願意讓外人知道,因爲這些類是輔助我public類的。

一個java文件,可以沒有public類,但是最多有一個public類,如果有Public類,那麼這個類就必須跟文件名相同。可以有0個到多個輔助類。java編程思想(第4版)第111頁上說,意味着該文件中有且只有一個Public類, 感覺這句話是有問題的。 完全可以沒有public類

類的訪問權限

一個方法一個域有四種訪問權限:public  protected  包訪問  private。  這四個權限可以比較好的分出界限,讓誰用不讓誰用,都有了比較清楚的界限。  爲什麼類只有兩個????類有兩個權限,一個public   一個包訪問權限。  public就是說這個類可以隨便外界使用,包訪問權限就是輔助類的權限了,只允許同一個包內的別的類使用該輔助類。  如果是要添加private控制一個類的權限,那麼想表達什麼意思呢???可能會說,我在輔助類的前面添加上一個Private,就想控制:僅僅允許同一個java文件內的主類使用這個類。 有沒有這個需求呢???肯定有,因爲如果這個輔助類僅僅屬於這一個主類,那麼我就可以方便修改了,而不用管別的類是否在使用。 但是Java爲什麼沒有設定這個private權限?  答案是:Java提供了一個更容易理解的方式--內部類 實現了這個需求。 用private修飾一個輔助類,其實是不符合private的意思的。所以用內部類來表示顯的更自然。  那類爲什麼沒有protected呢??我感覺沒有這個需求吧。 別的類要想繼承我這個類,必須先能看到我這個類。 如果你看不到我這個類,那還繼承什麼阿???

發佈了33 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章