Java 之路 (六) -- 訪問許可權控制(Package、Public、protected、friendly、private)
這一章內容比較少,也比較基礎。
不多廢話,下面開始這一章的學習吧。
學習內容
- 包 package
- 訪問許可權 public、protected、預設、private
1. Package
(1) 原因:為了更好的組織類,Java 提供了包機制,用來區別類名的名稱空間。
(2) 包的作用:
- 利用作業系統的層次化的檔案結構,將特定包的 .class 檔案都置於一個目錄下。
- 包建立了新的名稱空間,解決命名衝突問題。
- 便於查詢目錄結構中的類
- 將 package 分解為機器上的某個目錄,當 Java 程式執行需要載入 .class 檔案的時候,可以確定 .class 檔案再目錄上所處的位置。
- 將構件捆綁到一個內聚的類庫單元。
- 限定了訪問許可權,訪問許可權修飾詞得以起到作用。
(3) 程式碼組織
- 編寫 Java 原始碼檔案時,此檔案被稱為編譯/轉譯單元。每個編譯單元都必須有一個字尾名 .java ,而在編譯單元內則必須有且僅有一個 public 類,名稱與檔名稱一致(不包括字尾 .java)。該編譯單元裡的其他非 public 類通常用來為 public 類提供支援。
- 編譯 .java 檔案時,其中的每個類都會有一個輸出檔案,名稱與類的名稱相同,附加字尾 .class,因此少量 .java 檔案編譯會得到大量 .class 檔案。Java 的程式是一組可以打包並壓縮為一個 JAR 的 .class 檔案。Java 直譯器負責這些檔案的查詢、裝載和解釋。
- 類庫實際上述一組類檔案。其中每個檔案都有一個 public 類,以及任意數量的非 public 類。因此每個檔案都有一個構件。通過 package 關鍵字,使得這些構建從屬於同一個群組。
(4) 包的使用
宣告所屬包 – package 語句必須是檔案的第一行非註釋程式程式碼
//格式如下: package pkg1[.pkg2[.pkg3...]]; // eg. // 宣告 Book 類位於 com.whdalive.simple 這個包下 package com.whdalive.simple; public class Book{ public void show(){ //...
匯入 – import 關鍵詞,僅僅位於 package 語句之後
- 只有匯入相關包/類之後,才能訪問其中的方法/類(視訪問許可權而定)
//格式如下 package pkg..; import pkg1[[.pkg2[.pkg3...]]]; // eg. package com.example; import java.util.ArrayList;// 匯入了 java.util.ArrayList 這個類 // 也可以寫成這樣: import java.util.*; // 匯入整個 java.util 包,自然包括 ArrayList 這個類。 public class ExampleImport{ ArrayList list = new ArrayList(); }
(5) Java 直譯器的執行過程
首先解釋一下 Java 直譯器的概念:
直譯器是Java虛擬機器非常重要的一部分,它的工作就是把位元組碼轉化為機器碼並在特定的平臺進行執行
- 找出環境變數 CLASSPATH(可以通過作業系統設定,也可不用設定,一般編譯環境會為你設定)CLASSPATH 包含一個或多個目錄,用來查詢.class檔案的根目錄。
- 需要從根目錄進行查詢,直譯器獲取包的名稱,將點號替換為反斜槓,具體哪種反斜槓視作業系統而定。
- 將得到的路徑與 CLASSPATH 中的各個不同的項相連線,直譯器就在這些目錄中查詢與你建立的類名稱相關的 .class 檔案。
(6) 包的實際用處 - 我們通過使用包來幹些什麼?
- 定製我們自己的工具包 – 將重複使用的工具類打包在一起,簡化開發
- 內聚功能模組 – 將同一個功能模組的類打包在一起,同樣是為了簡化開發。
- …
2. Java 訪問許可權
關於繼承,在下一章會介紹。
(1) 四種訪問許可權:
- public:介面訪問許可權。Java語言中訪問限制最寬的修飾符。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包訪問。
- protected:繼承訪問許可權。介於public 和 private 之間的一種訪問修飾符。被其修飾的屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
- 預設:包訪問許可權。即不加任何訪問修飾符。該模式下,只允許在同一個包中進行訪問。
- private:私有訪問許可權。Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的物件訪問,其子類不能訪問,更不能允許跨包訪問。
注意:關於 protected 允許子類訪問這一點
子類可以直接訪問父類 protected 的屬性/方法,但是不能通過父類的例項物件來訪問父類的屬性/方法。
實際上可以理解為 子類繼承了父類的 protected 方法,與其說”父類的 protected 方法被子類訪問”,不如說”子類訪問了 從父類那裡繼承而來的 protected 方法”。通過繼承,子類也擁有了該 protected 方法,所以變相就是子類訪問了”自己的方法”。
結論:
許可權 | 類內 | 同包 | 不同包子類 | 不同包非子類 |
---|---|---|---|---|
private | √ | × | × | × |
預設 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
(2) 封裝
- 指將資料和方法包裝進類裡,以及具體實現的隱藏(也稱就是 訪問許可權的控制)。
(3) 訪問許可權控制將許可權的邊界劃在資料型別的內部,兩個原因:
設定客戶端程式設計師可以使用和不可以使用的界限。
說白了就是使使用者不要觸碰那些他們不該觸碰的部分,只提供給他們能實現的功能,而非實現細節。
將介面和具體實現進行分離。
類庫設計者設計一個功能模組,在底層進行實現,而只對客戶端程式設計師暴露出介面,客戶端程式設計師通過呼叫該介面即可使用該功能。
嚴格將介面和實現進行分離後,類庫設計者就可以隨意更改類的內部工作方式(出於某種目的,比如提高效率),而不影響客戶端程式設計師的使用,實現方式改變,但介面不變。
總結
這一章內容很少,大體上就是類和類庫的關係,其中有兩點:
- 類如何打包到類庫中,結構如何
- 如何控制訪問的許可權
基本就是些概念的東西,但是如何在實際中有良好的使用才是關鍵所在。
本章結束,共勉。