OOP丨《Java編程思想》閱讀筆記Chapter 6 : 訪問權限控制

《Java編程思想》Chapter 6 : 訪問權限控制


  • 1. 前言
    • 1.1. 訪問權限控制的等級
    • 1.2. package關鍵字的引入
  • 2. 包:庫單元
    • 2.1. 代碼組織
    • 2.2. 包名的創建
  • 3. Java訪問權限修飾詞
    • 3.1. 包訪問權限
    • 3.2. public: 接口訪問權限
    • 3.3. private: 你無法訪問
    • 3.4. protected: 繼承訪問權限
  • 4. 接口和實現
    • 4.1. 封裝
  • 5. 類的訪問權限
    • 5.1. 部分額外限制
    • 5.2. 作用
    • 5.3. 一些特殊用法

1. 前言

我們總是會發現我們希望對于我們的代碼進行重寫以改進
使得其更可讀、更易理解,因而更具有可維護性
這便是重構

但是我們改變代碼,就可能會引發它的變化
但對于使用者來說,會希望代碼保持不變
這邊產生一個問題:如何將代碼中變動的事物與不變的事物區分開來?
這對于類庫尤其重要

這便是訪問權限控制的作用
Java提供 訪問權限修飾詞
用于向代碼使用者指明,哪部分是可以用的,哪部分是不可以用的

1.1. 訪問權限控制的等級

從最大權限到最小權限

  1. public
    任何地方都可以訪問
  2. protected
    同一個包內,或者子類可以訪問
  3. 包訪問權限(no keyword, default)
    同一個包內可以訪問
  4. private
    只有類內可以訪問

1.2. package關鍵字的引入

對于 訪問權限修飾詞
還存在著如何將構件捆綁到一個內聚的類庫單元中的問題
Java使用 package 關鍵字來解決這個問題

2. 包:庫單元

**包(package)**內包含有一組類
被組織在單一的名字空間之下
也就是包名

我們一直使用的導入,就是提供一個管理名字空間的機制
我們平時編寫的Java源文件,通常被稱為編譯單元(或轉譯單元)
每個編譯單元只能由不超過一個public
編譯單元中的public類對包外可見

2.1. 代碼組織

我們可以發現,我們對一個編譯單元進行編譯后
其中的每個類都會有一個輸出文件,有著.class的后綴
他們可以被打包并壓縮為一個java文檔文件(JAR,使用Java的jar文檔生成器)
而類庫則實際上是一組類文件
其中每個文件都有一個public類,以及任意數量的非public
public類的名字必須與文件名相同

關鍵字package用于將類庫中的類組織在一起:

// 在一個包中的類
package PackageTest;

若使用package語句,則其必須是文件中除注釋外的第一句代碼

包的命名規則:
package的命名全部使用小寫字母,包括中間的字

對于packageimport的理解:
將單一的全局名字空間分割
使得不論多少人進行編寫,也不會出現名稱沖突的問題

2.2. 包名的創建

包從未整被真正打包為單一的文件
且一個包可以有多個.class文件構成
這可能造成復雜的情況

為了避免這種情況,我們將.class文件都置于一個目錄之下
利用操作系統的層次化化文件結構來解決此問題
這是Java解決混亂問題采用的一種方式

同時另外兩個問題也可以被解決:

  1. 如何創建獨一無二的名稱?
  2. 如何查找可能隱藏于目錄結構中某處的類?

包名的創建:
依據慣例,報名使用創建者的反順序域名
(域名是第一無二的,那么包名因而也是獨一無二的)
沒有域名,也可以采用不太可能重復的組合
例子top.thesumst.lab

尋址方法:
package名稱分解為系統上的一個目錄
然后在該目錄下尋找.class文件

Java解釋器尋找.class運行過程大致圖解:

graph LRA[Java解釋器] --> B[尋找CLASSPATH環境變量]B --> C[尋找包名]C --> |包名重構,將點替換為路徑|D[尋找包名對應的目錄]D --> E[尋找類文件]E --> F[加載類]

p.s. 使用jar文件時,必須在類路徑中將jar文件的實際名稱寫清楚
(實際上可以理解為一個目錄的根目錄)

沖突處理:
可以想象,還是喲可能出現幾個包中出現重復類名的情況
如果我們使用通配符*導入包,那么可能會出現問題
此時我們需要指明具體的包名
或者我們可以使用import語句的全名形式,指定導入類
從而大大降低了沖突的可能性

p.s. 默認包:當沒有使用package語句時,類位于默認包中,同樣目錄下的默認包中的類之間具有包訪問權限

3. Java訪問權限修飾詞

Java中的四種Java訪問權限修飾詞:

  • public
  • protected
  • 包訪問權限(no keyword, default)
  • private

他們用于在類中每個實例變量或方法前進行修飾
并僅作用于這個定義
其中,不提供任何訪問權限修飾詞,意味著包訪問權限

3.1. 包訪問權限

包訪問權限意味著對當前包中的所有其他類都可見
但是包之外的所有類,都沒有這個成員的訪問權限

因而希望取得某成員的訪問權,我們只有幾個途徑:

  1. public聲明
  2. 不加訪問權限修飾詞,將其他類至于同一個包中
  3. protected聲明,繼承此類的子類可以訪問
  4. 對于private聲明,提供訪問器(getter)和修改器(setter)方法
    使得其他類可以通過這兩個方法訪問
    OOP中最優雅的方式

3.2. public: 接口訪問權限

public關鍵字修飾成員,表示其對每個人都是可用的

3.3. private: 你無法訪問

private關鍵字修飾成員
表示除了成員所示類之外,其他任何類都無法訪問

使用場景舉例:

  1. 控制類的對象的創建
    顯示定義構造器,并將其聲明為private
    此時我們可以通過提供一個public的靜態方法來創建對象
    這有利于我們控制對象的創建
    (還會組織對于此類的繼承)
  2. "助手"方法
    如果一個方法,我們確定它只會被用于輔助類中的別的方法
    我們可以將它指定為private
    可以組織我們在包內的其他地方對其進行誤用
  3. 域一般應該指定為private
    通過提供public方法來訪問域
    使得我們可以控制對域的訪問
    除非需要公開底層的實現細節(不太常見),否則一般推薦將所有域都指定為private

3.4. protected: 繼承訪問權限

protected關鍵字修飾成員
主要用于處理集成概念
說明這個成員對于繼承的子類是可見的
此外,還提供包訪問權限

4. 接口和實現

4.1. 封裝

對訪問權限的控制,常被稱為具體實現的隱藏
將數據和方法包裝進類中,以及具體是實現的隱藏,常共同被稱為封裝
結果是得到的同時帶有特征和行為數據類型

訪問權限控制將權限控制于數據類型的內部
兩個重要原因:

  1. 要設定代碼中,可以被使用和不可以被使用的界限
    一般我們稱使用者為客戶端程序員
  2. 接口和具體實現進行分離
    如果我們限制客戶端程序員除了向接口發送信息之外不可以進行別的操作
    那么我們可以在不破壞客戶端代碼的情況下
    隨意修改任何不是public的東西(也就是接口之外的東西)

常用的實踐模式:
public成員至于開頭
隨后耕者protected、包訪問權限、private成員
這樣便于類的使用者抓住重點
因為這樣他們只需要閱讀public部分,也就是他們需要同時也是可以訪問的部分

5. 類的訪問權限

不同于類的成員
類的訪問權限只有兩種public包訪問權限

5.1. 部分額外限制

  1. 每個編譯單元只能有一個public
  2. public類的必須完全與其所處的編譯單元的文件名相同
    包括大小寫
  3. 編譯單元內可以不帶public類(不常用)

5.2. 作用

確保客戶端程序員只使用我們希望提供給外部使用的類
而非我們可能知識用于內部實現,或者后續很可能更改或刪除的類

5.3. 一些特殊用法

如果我們不希望其他任何人擁有某個類的訪問權限
我們可以將其所有的構造器都指定為private
如此,除了該類static成員內可以創建
其他任何人都無法創建該類的對象

這種操作有幾種可能的用途:

  1. 返回引用之前對對象做一些額外的工作
  2. 記錄對象的創建次數,可以限制對象的數量

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

reconic 天空 模型

目錄 推理代碼: EnvLight 代碼: 推理代碼: sky_model self.models["Sky"]outputs["rgb_sky"] sky_model(image_info)outputs["rgb_sky_blend"] outputs["rgb_sky"] * (1.0 - outputs["opa…

從服務器多線程批量下載文件到本地

1、客戶端安裝 aria2 下載地址:aria2 解壓文件,然后將文件目錄添加到系統環境變量Path中,然后打開cmd,輸入:aria2c 文件地址,就可以下載文件了 2、服務端配置nginx文件服務器 server {listen 8080…

C++ | 可變模板參數

1. 為什么需要可變模板參數? 在C11之前,若想實現一個接受任意數量參數的函數,只能依賴va_list等C風格可變參數,但這種方式類型不安全且難以調試。例如printf函數: printf("%d %f %s", 10, 3.14, "hel…

【機器學習】每日一講-樸素貝葉斯公式

文章目錄 **一、樸素貝葉斯公式詳解****1. 貝葉斯定理基礎****2. 從貝葉斯定理到分類任務****3. 特征獨立性假設****4. 條件概率的估計** **二、在AI領域的作用****1. 文本分類與自然語言處理(NLP)****2. 推薦系統****3. 醫療與生物信息學****4. 實時監控…

AI Agents系列之AI代理的類型

在本文中,我們將探討不同類型的 AI 代理,包括它們的實現、實際應用、優勢和局限性。從簡單反射代理到多代理系統,我們將了解這些模型如何推動自動化、決策制定和智能問題解決。 文章目錄 1. AI代理的類型1.1 簡單反射代理1.1.1 實現**1.1.2 優勢****1.1.3 局限性**1.2 基于…

C# --- IEnumerable 和 IEnumerator

C# --- IEnumerable 和 IEnumerator IEnumerableIEnumeratorIEnumerable 和 IEnumerator 的作用手動實現 IEnumerableIEnumerable vs. IQueryable為什么有了ienumerator還需要ienumerable IEnumerable 在C#中,IEnumerable 是一個核心接口,用于表示一個可…

鏡舟科技助力某大型電網企業破解數據架構升級難題,打造國產化湖倉標桿

在 “十四五” 規劃全面推進國產化替代的背景下,某大型電網企業聯合鏡舟科技與騰訊云,基于全球領先的開源分析型數據庫 StarRocks 及騰訊 TBDS 大數據平臺,構建電力行業國產化湖倉一體架構。該項目實現 PB 級電力數據的統一管理,為…

Spark-SQL核心編程3

數據加載與保存 通用方式: SparkSQL 提供了通用的保存數據和數據加載的方式。這里的通用指的是使用相同的API,根據不同的參數讀取和保存不同格式的數據,SparkSQL 默認讀取和保存的文件格式為parquet 數據加載方法: spark.read.lo…

使用HTML + CSS + JS,編寫一個臺球追分計分器

目錄 一.代碼 二.效果展示 三.該計分器的優點 一.代碼 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…

LLM小白自學筆記:1.兩種指令微調

一、LoRA 簡單來說&#xff0c;LoRA不直接調整個大模型的全部參數&#xff08;那樣太費資源&#xff09;&#xff0c;而是在模型的某些層&#xff08;通常是注意力層&#xff09;加個“旁路”——兩個小的矩陣&#xff08;低秩矩陣&#xff09;。訓練時只更新這倆小矩陣&#x…

2026《數據結構》考研復習筆記一(C++基礎知識)

C基礎知識復習 一、數據類型二、修飾符和運算符三、Lambda函數和表達式四、數學函數五、字符串六、結構體 一、數據類型 1.1基本類型 基本類型 描述 字節&#xff08;位數&#xff09; 范圍 char 字符類型&#xff0c;存儲ASCLL字符 1&#xff08;8位&#xff09; -128…

基于骨骼識別的危險動作報警分析系統

基于骨骼識別的危險動作報警分析系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】基于骨骼識別算法的實時危險行為預警方案 【技術棧】 ①&#xff1a;系統環境&#xff1a;Windows 10/11、macOS Ventura、Ubuntu 20.04 ②&#x…

【雙指針】四數之和(medium)

四數之和&#xff08;medium&#xff09; 題?描述&#xff1a;解法&#xff08;排序 雙指針&#xff09;算法思路&#xff1a; C 算法代碼&#xff1a;Java 算法代碼&#xff1a; 題?鏈接&#xff1a;18. 四數之和 題?描述&#xff1a; 給你?個由 n 個整數組成的數組 num…

Flask+Influxdb+grafna構建電腦性能實時監控系統

Influx下載地址&#xff0c;這里下載了以下版本influxdb-1.8.5_windows_amd64.zip 運行前需要先啟動Influx數據庫&#xff1a; 管理員方式運行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf&#xff0c;以influxdb.conf配置文件啟動數…

如何在Keil中配置國民技術N32G系列MCU開發環境

如何在Keil及Jlink中搭建國民技術N32G系列MCU開發環境 根據自己的MCU型號&#xff08;我這里的型號是N32G452REL7&#xff09;訪問國民技術官網&#xff0c;依次從N32G通用MCU-技術資源-固件和軟件-軟件開發套件&#xff0c;獲取對應MCU型號的SDK&#xff0c;也可點擊這里從網盤…

微軟承認Win11出現極端錯誤,只能強制關機或重裝系統

最近&#xff0c;不少使用 Windows 11 的用戶反映&#xff0c;在系統更新后&#xff0c;“Windows Hello”突然失效&#xff0c;原本便捷的人臉識別和PIN登錄功能統統無法使用。更糟的是&#xff0c;有人在重置系統后直接被擋在系統門外&#xff0c;這讓人不禁發問&#xff1a;…

【android bluetooth 協議分析 02】【bluetooth hal 層詳解 1】【uart 介紹】

一、什么是 UART&#xff1f; UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09; 是一種 串行通信協議&#xff0c;它的特點是通信時不需要專門的時鐘信號&#xff08;叫做“異步”通信&#xff09;&#xff0c;常用于兩個設備之間的簡單數據通信&…

天元證券|奶粉行業結構性回暖 乳企競速全齡化、國際化

在過去幾年中&#xff0c;中國嬰配粉市場經歷了量價齊增&#xff0c;量減價增&#xff0c;量減價減的三個周期。歷經多年行業深度洗牌與競爭格局重塑&#xff0c;2024年中國嬰配粉市場回暖態勢愈發清晰可辨。 日前&#xff0c;包括中國飛鶴、澳優、健合集團在內的多家奶粉股披露…

第3.1節 調用鏈路分析簡介

調用鏈路&#xff08;Call Chain / Call Path&#xff09; 是程序在執行過程中&#xff0c;按照調用順序形成的函數、模塊或組件之間的依賴關系鏈條&#xff0c;完整記錄了從程序入口到當前執行點的動態調用路徑。它反映了代碼執行的邏輯流程&#xff0c;是分析程序行為、調試問…

System.Security.Cryptography.CryptographicException“填充無效,無法被移除。”

這個異常通常發生在以下幾種情況&#xff1a; 1.密文損壞&#xff1a;密文在傳輸或存儲過程中被篡改或損壞。 2.密鑰不匹配&#xff1a;用于解密的密鑰與加密時使用的密鑰不同。 3.填充模式不匹配&#xff1a;加密時使用的填充模式與解密時指定的填充模式不一致。 4.使用了不正…