這一章內(nèi)容比較少,也比較基礎(chǔ)。
不多廢話,下面開始這一章的學(xué)習(xí)吧。
學(xué)習(xí)內(nèi)容
- 包 package
- 訪問權(quán)限 public、protected、默認(rèn)、private
1. Package
(1) 原因:為了更好的組織類,Java 提供了包機(jī)制,用來區(qū)別類名的命名空間。
(2) 包的作用:
- 利用操作系統(tǒng)的層次化的文件結(jié)構(gòu),將特定包的 .class 文件都置于一個(gè)目錄下。
- 包創(chuàng)建了新的命名空間,解決命名沖突問題。
- 便于查找目錄結(jié)構(gòu)中的類
- 將 package 分解為機(jī)器上的某個(gè)目錄,當(dāng) Java 程序運(yùn)行需要加載 .class 文件的時(shí)候,可以確定 .class 文件再目錄上所處的位置。
- 將構(gòu)件捆綁到一個(gè)內(nèi)聚的類庫單元。
- 限定了訪問權(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)行
- 找出環(huán)境變量 CLASSPATH(可以通過操作系統(tǒng)設(shè)置,也可不用設(shè)置,一般編譯環(huán)境會(huì)為你設(shè)置)CLASSPATH 包含一個(gè)或多個(gè)目錄,用來查找.class文件的根目錄。
- 需要從根目錄進(jìn)行查詢,解釋器獲取包的名稱,將點(diǎn)號替換為反斜杠,具體哪種反斜杠視操作系統(tǒng)而定。
- 將得到的路徑與 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è)原因:
-
設(shè)定客戶端程序員可以使用和不可以使用的界限。
說白了就是使用戶不要觸碰那些他們不該觸碰的部分,只提供給他們能實(shí)現(xiàn)的功能,而非實(shí)現(xiàn)細(xì)節(jié)。
-
將接口和具體實(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):
- 類如何打包到類庫中,結(jié)構(gòu)如何
- 如何控制訪問的權(quán)限
基本就是些概念的東西,但是如何在實(shí)際中有良好的使用才是關(guān)鍵所在。
本章結(jié)束,共勉。