1. 程式人生 > >Java 之路 (六) -- 訪問許可權控制(Package、Public、protected、friendly、private)

Java 之路 (六) -- 訪問許可權控制(Package、Public、protected、friendly、private)

這一章內容比較少,也比較基礎。

不多廢話,下面開始這一章的學習吧。

學習內容

  • 包 package
  • 訪問許可權 public、protected、預設、private

1. Package

(1) 原因:為了更好的組織類,Java 提供了包機制,用來區別類名的名稱空間。

(2) 包的作用:

  1. 利用作業系統的層次化的檔案結構,將特定包的 .class 檔案都置於一個目錄下。
    1. 包建立了新的名稱空間,解決命名衝突問題。
    2. 便於查詢目錄結構中的類
    3. 將 package 分解為機器上的某個目錄,當 Java 程式執行需要載入 .class 檔案的時候,可以確定 .class 檔案再目錄上所處的位置。
  2. 將構件捆綁到一個內聚的類庫單元。
  3. 限定了訪問許可權,訪問許可權修飾詞得以起到作用。

(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虛擬機器非常重要的一部分,它的工作就是把位元組碼轉化為機器碼並在特定的平臺進行執行

  1. 找出環境變數 CLASSPATH(可以通過作業系統設定,也可不用設定,一般編譯環境會為你設定)CLASSPATH 包含一個或多個目錄,用來查詢.class檔案的根目錄。
  2. 需要從根目錄進行查詢,直譯器獲取包的名稱,將點號替換為反斜槓,具體哪種反斜槓視作業系統而定。
  3. 將得到的路徑與 CLASSPATH 中的各個不同的項相連線,直譯器就在這些目錄中查詢與你建立的類名稱相關的 .class 檔案。

(6) 包的實際用處 - 我們通過使用包來幹些什麼?

  • 定製我們自己的工具包 – 將重複使用的工具類打包在一起,簡化開發
  • 內聚功能模組 – 將同一個功能模組的類打包在一起,同樣是為了簡化開發。

2. Java 訪問許可權

關於繼承,在下一章會介紹。

(1) 四種訪問許可權:

  • public:介面訪問許可權。Java語言中訪問限制最寬的修飾符。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包訪問。
  • protected:繼承訪問許可權。介於public 和 private 之間的一種訪問修飾符。被其修飾的屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
  • 預設:包訪問許可權。即不加任何訪問修飾符。該模式下,只允許在同一個包中進行訪問。
  • private:私有訪問許可權。Java語言中對訪問許可權限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的物件訪問,其子類不能訪問,更不能允許跨包訪問。

注意:關於 protected 允許子類訪問這一點

子類可以直接訪問父類 protected 的屬性/方法,但是不能通過父類的例項物件來訪問父類的屬性/方法。

實際上可以理解為 子類繼承了父類的 protected 方法,與其說”父類的 protected 方法被子類訪問”,不如說”子類訪問了 從父類那裡繼承而來的 protected 方法”。通過繼承,子類也擁有了該 protected 方法,所以變相就是子類訪問了”自己的方法”。

結論:

許可權 類內 同包 不同包子類 不同包非子類
private × × ×
預設 × ×
protected ×
public

(2) 封裝

  • 指將資料和方法包裝進類裡,以及具體實現的隱藏(也稱就是 訪問許可權的控制)。

(3) 訪問許可權控制將許可權的邊界劃在資料型別的內部,兩個原因:

  1. 設定客戶端程式設計師可以使用和不可以使用的界限。

    說白了就是使使用者不要觸碰那些他們不該觸碰的部分,只提供給他們能實現的功能,而非實現細節。

  2. 將介面和具體實現進行分離。

    類庫設計者設計一個功能模組,在底層進行實現,而只對客戶端程式設計師暴露出介面,客戶端程式設計師通過呼叫該介面即可使用該功能。

    嚴格將介面和實現進行分離後,類庫設計者就可以隨意更改類的內部工作方式(出於某種目的,比如提高效率),而不影響客戶端程式設計師的使用,實現方式改變,但介面不變。

總結

這一章內容很少,大體上就是類和類庫的關係,其中有兩點:

  1. 類如何打包到類庫中,結構如何
  2. 如何控制訪問的許可權

基本就是些概念的東西,但是如何在實際中有良好的使用才是關鍵所在。

本章結束,共勉。