Java 之路 (六) -- 訪問權(quán)限控制(Package、Public、protected、friendly、private)

這一章內(nèi)容比較少,也比較基礎(chǔ)。

不多廢話,下面開始這一章的學(xué)習(xí)吧。


學(xué)習(xí)內(nèi)容

  • 包 package
  • 訪問權(quán)限 public、protected、默認(rèn)、private

1. Package

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

(2) 包的作用:

  1. 利用操作系統(tǒng)的層次化的文件結(jié)構(gòu),將特定包的 .class 文件都置于一個(gè)目錄下。
    1. 包創(chuàng)建了新的命名空間,解決命名沖突問題。
    2. 便于查找目錄結(jié)構(gòu)中的類
    3. 將 package 分解為機(jī)器上的某個(gè)目錄,當(dāng) Java 程序運(yùn)行需要加載 .class 文件的時(shí)候,可以確定 .class 文件再目錄上所處的位置。
  2. 將構(gòu)件捆綁到一個(gè)內(nèi)聚的類庫單元。
  3. 限定了訪問權(quán)限,訪問權(quán)限修飾詞得以起到作用。

(3) 代碼組織

  • 編寫 Java 源代碼文件時(shí),此文件被稱為編譯/轉(zhuǎn)譯單元。每個(gè)編譯單元都必須有一個(gè)后綴名 .java ,而在編譯單元內(nèi)則必須有且僅有一個(gè) public 類,名稱與文件名稱一致(不包括后綴 .java)。該編譯單元里的其他非 public 類通常用來為 public 類提供支持。
  • 編譯 .java 文件時(shí),其中的每個(gè)類都會(huì)有一個(gè)輸出文件,名稱與類的名稱相同,附加后綴 .class,因此少量 .java 文件編譯會(huì)得到大量 .class 文件。Java 的程序是一組可以打包并壓縮為一個(gè) JAR 的 .class 文件。Java 解釋器負(fù)責(zé)這些文件的查找、裝載和解釋。
  • 類庫實(shí)際上述一組類文件。其中每個(gè)文件都有一個(gè) public 類,以及任意數(shù)量的非 public 類。因此每個(gè)文件都有一個(gè)構(gòu)件。通過 package 關(guān)鍵字,使得這些構(gòu)建從屬于同一個(gè)群組。

(4) 包的使用

  • 聲明所屬包 -- package 語句必須是文件的第一行非注釋程序代碼

    //格式如下:
    package pkg1[.pkg2[.pkg3...]];
    
    // eg.
    // 聲明 Book 類位于 com.whdalive.simple 這個(gè)包下
    package com.whdalive.simple;
    public class Book{
        public void show(){
            //...
        }
    }
    
  • 導(dǎo)入 -- import 關(guān)鍵詞,僅僅位于 package 語句之后

    • 只有導(dǎo)入相關(guān)包/類之后,才能訪問其中的方法/類(視訪問權(quán)限而定)
    //格式如下
    package pkg..;
    import pkg1[[.pkg2[.pkg3...]]];
    
    // eg.
    package com.example;
    import java.util.ArrayList;// 導(dǎo)入了 java.util.ArrayList 這個(gè)類
    // 也可以寫成這樣:
    import java.util.*; // 導(dǎo)入整個(gè) java.util 包,自然包括 ArrayList 這個(gè)類。
    public class ExampleImport{
        ArrayList list = new ArrayList();
    }
    
    

(5) Java 解釋器的運(yùn)行過程

首先解釋一下 Java 解釋器的概念:

解釋器是Java虛擬機(jī)非常重要的一部分,它的工作就是把字節(jié)碼轉(zhuǎn)化為機(jī)器碼并在特定的平臺進(jìn)行運(yùn)行

  1. 找出環(huán)境變量 CLASSPATH(可以通過操作系統(tǒng)設(shè)置,也可不用設(shè)置,一般編譯環(huán)境會(huì)為你設(shè)置)CLASSPATH 包含一個(gè)或多個(gè)目錄,用來查找.class文件的根目錄。
  2. 需要從根目錄進(jìn)行查詢,解釋器獲取包的名稱,將點(diǎn)號替換為反斜杠,具體哪種反斜杠視操作系統(tǒng)而定。
  3. 將得到的路徑與 CLASSPATH 中的各個(gè)不同的項(xiàng)相連接,解釋器就在這些目錄中查找與你創(chuàng)建的類名稱相關(guān)的 .class 文件。

(6) 包的實(shí)際用處 - 我們通過使用包來干些什么?

  • 定制我們自己的工具包 -- 將重復(fù)使用的工具類打包在一起,簡化開發(fā)
  • 內(nèi)聚功能模塊 -- 將同一個(gè)功能模塊的類打包在一起,同樣是為了簡化開發(fā)。
  • ...

2. Java 訪問權(quán)限

關(guān)于繼承,在下一章會(huì)介紹。

(1) 四種訪問權(quán)限:

  • public:接口訪問權(quán)限。Java語言中訪問限制最寬的修飾符。被其修飾的類、屬性以及方法不僅可以跨類訪問,而且允許跨包訪問。
  • protected:繼承訪問權(quán)限。介于public 和 private 之間的一種訪問修飾符。被其修飾的屬性以及方法只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
  • 默認(rèn):包訪問權(quán)限。即不加任何訪問修飾符。該模式下,只允許在同一個(gè)包中進(jìn)行訪問。
  • private:私有訪問權(quán)限。Java語言中對訪問權(quán)限限制的最窄的修飾符,一般稱之為“私有的”。被其修飾的屬性以及方法只能被該類的對象訪問,其子類不能訪問,更不能允許跨包訪問。

注意:關(guān)于 protected 允許子類訪問這一點(diǎn)

子類可以直接訪問父類 protected 的屬性/方法,但是不能通過父類的實(shí)例對象來訪問父類的屬性/方法。

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

結(jié)論:

權(quán)限 類內(nèi) 同包 不同包子類 不同包非子類
private × × ×
默認(rèn) × ×
protected ×
public

(2) 封裝

  • 指將數(shù)據(jù)和方法包裝進(jìn)類里,以及具體實(shí)現(xiàn)的隱藏(也稱就是 訪問權(quán)限的控制)。

(3) 訪問權(quán)限控制將權(quán)限的邊界劃在數(shù)據(jù)類型的內(nèi)部,兩個(gè)原因:

  1. 設(shè)定客戶端程序員可以使用和不可以使用的界限。

    說白了就是使用戶不要觸碰那些他們不該觸碰的部分,只提供給他們能實(shí)現(xiàn)的功能,而非實(shí)現(xiàn)細(xì)節(jié)。

  2. 將接口和具體實(shí)現(xiàn)進(jìn)行分離。

    類庫設(shè)計(jì)者設(shè)計(jì)一個(gè)功能模塊,在底層進(jìn)行實(shí)現(xiàn),而只對客戶端程序員暴露出接口,客戶端程序員通過調(diào)用該接口即可使用該功能。

    嚴(yán)格將接口和實(shí)現(xiàn)進(jìn)行分離后,類庫設(shè)計(jì)者就可以隨意更改類的內(nèi)部工作方式(出于某種目的,比如提高效率),而不影響客戶端程序員的使用,實(shí)現(xiàn)方式改變,但接口不變。


總結(jié)

這一章內(nèi)容很少,大體上就是類和類庫的關(guān)系,其中有兩點(diǎn):

  1. 類如何打包到類庫中,結(jié)構(gòu)如何
  2. 如何控制訪問的權(quán)限

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

本章結(jié)束,共勉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 1,連接數(shù)據(jù)庫 打開cmd窗口,使用命令,連接MySQL數(shù)據(jù)庫 mysql -u root p 密碼 ...
    蘇為閱讀 278評論 0 0
  • ”亞托克斯站在峽谷中,看著對面倒下的蘭博和他的機(jī)器人,回想起了自己強(qiáng)大的痛苦和艱辛…… 他還隱隱約約的記得,他是如...
    RoseQueen_78dc閱讀 216評論 0 0
  • 時(shí)光匆匆而過, 一晃 ,已經(jīng)過了三四個(gè)年頭。 記得那次初遇, 僅僅只是網(wǎng)絡(luò)上的初遇 。那一次, 你來到...
    唐jk德閱讀 278評論 0 2

友情鏈接更多精彩內(nèi)容