Java程式設計思想讀書筆記——第六章:訪問許可權控制
第六章 訪問許可權控制
- 初學Java的時候很納悶,為什麼要提供各種訪問修飾,都用public不就行了,程式都能執行,還多省事
- 我感覺如果這個程式只有你自己去編寫,去維護,那麼其實訪問許可權可以忽略
- 但是,比如說我寫了一個第三方開源庫,有很多很多的人在使用我的庫,那麼如果我對任何東西都不去限制,那麼“客戶端程式設計師”就可以去呼叫庫中的任何東西,但是我要維護這個庫,要出新版本,我根本不知道大家在用我庫中的什麼東西,那我怕影響大家的使用,不敢刪除任何的東西,那我作為類庫的開發者就無法對任何東西做出改動。所以這就是訪問許可權控制出現的原因
6.1 包:庫單元
- A類中的方法f()和B類中的方法f()是不會衝突的
- 如何防止不同程式的同名類衝突,引入了包的概念
- 相當於電腦資料夾,我兩個不同的資料夾都有一個相同名字的檔案,並不衝突
6.1.1 程式碼組織
- Java可執行程式是一組可以打包並壓縮為jar的.class檔案
- 在每一個類的開頭都會有package關鍵字,去宣告你所設計的類屬於誰
- import關鍵字會讓程式碼更加的簡潔
- 必須要牢記:package和import,使得無論多少人編寫類,都不會出現名稱衝突的問題
6.1.2 建立獨一無二的包名
- 一般用自己的域名將順序倒過來,可以得到一個獨一無二的域名(不過也不一定),不過不大可能衝突了
練習1、略
衝突
- import java.util.*
- import new.mindview.simple.*
- 如果他們都含有Vetor,那麼我們在建立一個Vetor例項的話就會發生衝突,編譯器不知道取哪個Vetor
練習2、略
6.1.3 定製工具庫
比如說將System.out.pringln()定製在一個工具類中,建立一個靜態的方法,直接使用
也就是我們平時說的封裝一些複雜的操作,然後用工具類一行程式碼就解決
無論什麼時候我們擁有了新的工具,都可以放到自己的類庫中去
6.1.4 用import改變行為
練習3、略
6.1.5 對使用包的忠告
無筆記
6.2 Java訪問許可權修飾詞
6.2.1 包訪問許可權
預設訪問許可權,沒有關鍵字,當前的包中的所有其他類都對那個成員有訪問許可權
6.2.2 public:介面訪問許可權
public後面緊跟著的成員宣告自己對每個人都是可用的
預設包
兩個檔案都沒有建立包,但是會認為它們有一個預設的包,使用包訪問許可權也可以訪問
6.2.3 private:你無法訪問
除了包含該成員的類之外,其他任何類都無法訪問這個成員,自己隔離自己
通常要考慮的是,哪些成員是想要明確公開給客戶端程式設計師使用的,將它們宣告為public
6.2.4 protected:繼承訪問許可權
比包訪問許可權多了一個子類可以訪問
練習4、略
練習5、略
練習6、略
6.3 介面和實現
- 具體實現的隱藏,常被稱作是“封裝”
- 訪問許可權控制將許可權劃在了資料型別的內部,有兩個原因,說實話,挺難理解。。。
- public成員置於開頭,後面跟著protected、包訪問許可權、和private成員的建立類的形式
6.4 類的訪問許可權
每一個檔案(類)只能有一個public類,比如或其他內部類就不能宣告為public了
檔名必須和類名一樣
練習7、略
對於類的訪問許可權,一般就是public和包訪問許可權,private和protected很少用
構造器私有化防止在其他類建立該類的物件,比如說單例模式
練習8、客戶端程式設計師不能直接建立Connection物件,通過ConnectionManager的static方法來獲取
// 這兩個類在同一個包下 public class Connection { private static int counter = 0; private int id = counter++; Connection() { } public String toString() { return "Connection " + id; } public void doSomething() { } } public class ConnectionManager { private static Connection[] pool = new Connection[10]; private static int counter = 0; static { for(int i = 0; i < pool.length; i++) pool[i] = new Connection(); } // Very simple -- just hands out each one once: public static Connection getConnection() { if(counter < pool.length) return pool[counter++]; return null; } } public class E08_ConnectionManager { public static void main(String args[]) { Connection c = ConnectionManager.getConnection(); while(c != null) { System.out.println(c); c.doSomething(); c = ConnectionManager.getConnection(); } } }
練習9、執行程式碼,為什麼編譯器會出現錯誤
解決方案:PackagedClass位於自己的包中,不是公共類,因此在包access.local之外不可用。 如果Foreign也是access.local的一部分,那麼它將與PackagedClass在同一個包中,並且可以訪問它。
6.5 總結
1、當建立了一個類庫,也就是與客戶端程式設計師建立了某種關係,客戶端程式設計師使用你的類庫構建應用程式,或者更大的類庫,如果不指定規則,所有事物都是公開的,不太好
2、package和import使得名稱衝突的問題是很容易避免的
3、訪問控制的原因有二:
- 告訴客戶端程式設計師哪些該碰,哪些不該碰,告訴他們什麼重要,什麼不重要
- 讓類庫設計者可以隨意更改它們的程式碼,而不必考慮會影響到使用者
4、如果你自己編寫了所有的程式碼,所有東西都在一個包中,那麼訪問修飾不一定需要嚴格遵守
相關推薦
Java程式設計思想讀書筆記——第六章:訪問許可權控制
第六章 訪問許可權控制 初學Java的時候很納悶,為什麼要提供各種訪問修飾,都用public不就行了,程式都能執行,還多省事 我感覺如果這個程式只有你自己去編寫,去維護,那麼其實訪問許可權可以忽略 但是,比如說我寫了一個第三方開源庫,有很多很多的人在使用我的庫,那麼如
java程式設計思想讀書筆記----第十章 內部類
1、建立內部類 將類的定義置於外部類的裡面,在外部類中可以直接new一個內部類的事例,通常外部類會有一個方法,該方法會返回一個指向內部類的引用。如果從外部類非靜態方法之外的位置其它類建立某個內部類的物件,必須具體的指明這個物件的型別:OutClassNam
Java程式設計思想 第六章:訪問許可權控制
一個優秀的程式設計師是通過不斷的重構程式碼讓自己的程式變得更加易用、可讀和完善的。在重構修改的過程中,如果是一個類庫編寫人員,那麼怎麼樣保證自己修改的部分不會影響到客戶端編寫人員(即使用這個類庫的程式設計師)呢?同時也要避免他們對自己類庫內部的程式進行改動。Java中提供了訪問許可權控制的概
java程式設計思想讀書筆記 第十五章 泛型 (匿名內部類和擦除)
1.匿名內部類 泛型還可以應用於內部類以及匿名內部類。下面的例子使用匿名內部類實現了Generator介面: public class Customer { private static long counter = 1; private f
Java程式設計思想學習筆記-第11章
.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-famil
java程式設計思想學習筆記——第1章 物件導論
1.1 抽象過程 面向物件思想的實質:程式可以通過新增新型別的物件使自身適用於某個特定問題。 面向物件思想的五個基本特徵: 1)萬物皆物件 2)程式是物件的集合 3)每個物件都有自己的由其他物件所構成的儲存 4)每個物件都有其型別 5)某一特定型別的所有物件都可以接收同樣的訊息 物件具有行為、
java程式設計思想學習筆記——第2章 一切都是物件
儘管java是基於C的,但是相比之下,java是一種更“純粹”的面向物件程式設計語言。 2.1 用引用操縱物件 一切都視為物件,因此可採用單一固定的語法。儘管這一切都看作物件,但操縱的識別符號實際上是物件的一個“引用(reference)”。 java語言的一個特性:字串可以用帶引號的文字初始化。通常,
Java程式設計思想學習筆記——第7章 複用類
7.8 final關鍵字 final指得是“這是無法改變的”。不想做改變可能出於兩種理由:設計或效率。 可能使用到final的三種情況:資料、方法和類。 7.9初始化及類的載入 載入時眾多變得更加容易的動作之一,因為Java中的所有事物都是物件。請記住,每個類的編譯程
Java程式設計思想學習(三)----第三章:操作符
3.2使用Java操作符 操作符接受一個或多個引數,並生成一個新值。 操作符作用於運算元,生成一個新值。有些操作符可以改變運算元自身的值。幾乎所以的操作符都只能操作“基本型別”。例外的操作符有“=”,“==”,“!=”,這些操作符能操作所有物件。String支援“+”和“+=”。 3
Java程式設計思想學習(四)----第四章:控制執行流程
在Java中,涉及的關鍵字包括if-else、while、do-while、for、return、break 以及選擇語句switch。然而,Java並不支援goto語句(該語句引起許多反對意見,但它仍是解決某些特殊問題的最便利的方法)。在Java中,仍然可以進行類似goto那樣的跳轉,但比起典型的got
Java程式設計思想學習(五)----第5章:初始化與清理
隨著計算機革命的發展,“不安全”的程式設計方式已逐漸成為程式設計代價高昂的主因之一。 C++引入了構造囂(constructor)的概念,這是一個在建立物件時被自動呼叫的特殊方法。Java中也採用了構造器,並額外提供了“垃圾回收器”。對於不再使用的記憶體資源,垃圾回收器能自動將其釋放。 5.1 用構造器確
《lua程式設計》讀書筆記 第四章:語句
4.1 賦值 Lua支援“多重賦值”,即可以一次性將多個值賦予多個變數。 a,b = 10, 2*x 在多重賦值中,Lua先對等號右邊所有元素求值,然後才執行賦值,這樣便可以進行交叉賦值 x,y = y,x a[i], a[j] = a[j],
Thinking in Java 第四版完整版 第六章練習題 訪問許可權控制
Thinking in Java 第四版完整版 第六章練習題,記錄一下(jdk1.8.0) 1. package com.test.c06; /** * 練習1:在某個包中建立一個類,在這個類所處的包的外部建立該類的一個例項。 * @author admin11
Java程式設計思想讀書筆記(一)第1~13、16章
目錄: 第1章 物件導論 1.1 伴隨多型的可互換物件 面向物件程式設計語言使用了後期繫結的概念。當向物件傳送訊息時,被呼叫的程式碼直到執行時才能確定。也叫動態繫結。 編譯器確保被呼叫方法的存在,並對呼叫引數和返回值執行型別檢查(Java是強型別的語言,無法
《Java編程思想》筆記 第六章 訪問權限控制
互訪問 無法 this port 3.2 access 不能 外部 包名 1.編譯單元 一個 編譯單元即 .java 文件 內只能有一個 public 類 且該文件名必須與public 類名 完全一致。 編譯單元內也可以沒有public類 文件名可隨意。 2. 包:庫
Java程式設計思想:第六章:訪問控制
第六章:訪問控制 訪問控制(或者隱藏具體實現)與(最初的實現並不恰當)有關。 所有的優秀作者,包括哪些編寫軟體的程式設計師,都清楚著作的某些部分直至重新創作的時候才變得完美,有時甚至要反覆重寫幾次。如果
Core Java Volume I 讀書筆記--第4章 對象與類
volume nod sina x86 userinfo -- tar .com ndt 20r拿3角51諼3http://weibo.com/p/1005056264972659 SI境嗇7U侍凡17院http://shequ.docin.com/dpyy387 宦3
強化學習(RLAI)讀書筆記第六章差分學習(TD-learning)
第六章:Temporal-Difference Learning TD-learning演算法是強化學習中一個獨具特色而又核心的想法,結合了蒙特卡洛演算法和動態規劃的想法。和MC一樣不需要環境模型直接從sample裡學習,也像DP一樣使用bootstrap通過別的狀態值的估計更新當前狀態值。首先
java程式設計思想讀書筆記二(物件的建立)
java物件 物件的建立 java的物件是在執行時建立的,建立物件的的觸發條件有以下幾種: 用new語句建立物件,這是最常用的建立物件方法。 運用反射手段,呼叫java.lang.reflect.Constructor類的newInstance()例項方法。
java程式設計思想讀書筆記一(面向物件)
面向物件 我們常見的程式設計正規化有指令式程式設計,函數語言程式設計,邏輯式程式設計,而面向物件程式設計也是一種指令式程式設計。 指令式程式設計式面向計算機硬體的一種抽象,有變數(儲存單元),賦值語句(獲取儲存指令),表示式(記憶體引用和算術運算)和控制語句(跳轉指令),命令式程