1.什麼是包?
Java 允許使用包(package> 將類組織起來。
藉助於包可以方便地組織自己的代碼,並將 自己的代碼與別人提供的代碼庫分開管理。- 標準的 Java 類庫分佈在多個包中,包括java.lang、java.util 和java.net 等。
標準的 Java 包具有一個層次結構。
如同硬盤的目錄嵌套一樣,也可以使用嵌套層次組織包。所有標準的 Java 包都處於java 和javax 包層次中。 使用包的主要原因是確保類名的唯一性。
假如兩個程序員不約而同地建立了 Employee 類。只要將這些類放置在不同的包中, 就不會產生衝突。- 事實上,爲了保證包名的絕對 唯一性, Sun 公司建議將公司的因特網域名(這顯然是獨一無二的)以逆序的形式作爲包 名,並且對於不同的項目使用不同的子包。例如, horstmann.com 是本書作者之一註冊的域 名。逆序形式爲 com.horstmann。這個包還可以被進一步地劃分成子包, 如 com.horstmann. corejava。
從編譯器的角度來看, 嵌套的包之間沒有任何關係。
例如,java.util 包與java.util.jar 包 毫無關係。每一個都擁有獨立的類集合
。
2.類的導入—import類或包
一個類可以使用所屬包中的所有類, 以及其他包中的公有類(public class)。
- 在包中定位類是編譯器 ( compiler) 的工作。類文件中的字節碼肯定使用完整的包名來引 用其他類。
我們可以採用兩種方式訪問另一個包中的公有類:
- 第一種方式是在每個類名之前添加完整的包名。 例如:
java.tiie.LocalDate today = java.tine.LocalDate.now();
- 第二種更簡單且更常用的方式是使用
import
語句。
import 語句是一種引用包含在包中的類的簡明描述
。
一旦使用了 import 語句,在使用類時,就不必寫出包的全名了。
可以使用 import 語句導人一個特定的類或者整個包。
import 語句應該位於源文件的頂部 (但位於 package語句的後面)
。
例如, 可以使用下面這條語句導人 java.util 包中所有的類
。
import java.util.*;
然後, 就可以使用:LocalDate today = LocalDate.now();
而無須在前面加上包前綴
還可以導人一個包中的特定類
:import java.time.LocalDate;
需要注意
的是, 只能使用星號() 導入一個包, 而不能使用 import java. 或 importjava.*.*導入以 java 爲前綴的所有包。- 在大多數情況下, 只導入所需的包, 並不必過多地理睬它們。但
在發生命名衝突的時 候,就不能不注意包的名字
了。
例如,java.util 和java.sql 包都有日期( Date) 類。如果在程 序中導入了這兩個包:
- 此時編譯器無法確定程序使用的是哪一個 Date 類。可以採用增加一個特定的 import 語句來 解決這個問題:
- 如果這兩個 Date 類都需要使用,又該怎麼辦呢? 答案是,在每個類名的前面加上完整的 包名。
3.靜態導入—靜態方法&靜態域
-import 語句不僅可以導人類,還增加了導人靜態方法和靜態域的功能。
4. 將類放入包中—聲明package
- 要想將一個類放人包中, 就必須將包的名字放在源文件的開頭,包中定義類的代碼之 前。
- 將包中的文件放到與完整的包名匹配的子目錄中
- 編譯器將類文件class也放在相同的目錄結構中(IDE中可能有所不同)
- 如果沒有在源文件中放置 package語句, 這個源文件中的類就被放置在一個默認包 ( defaulf package) 中。默認包是一個沒有名字的包
編譯器
對文件 (帶有文件分隔符’/'和擴展名 .java 的文件)進行操作。Java 解 釋器
加載類(帶有 . 分隔符)。
- 編譯器在編譯源文件的時候不檢查目錄結構
例如,假定有一個源文件開頭有下 列語句:
package con.myconpany;
即使這個源文件沒有在子目錄 com/mycompany 下, 也可以進行編譯。
如果它不依賴 於其他包, 就不會出現編譯錯誤。但是, 最終的程序將無法運行, 除非先將所有類文件 移到正確的位置上。
如果包與目錄不匹配, 虛擬機就找不到類
5.包的作用域—private&public
- 標記爲public 的
部分
可以被任意的類
使 用;- 標記爲private 的
部分
只能被定義它們的類
使用。- 如果
沒有指定
public 或 private,這個部 分(類、方法或變量)
可以被同一個包中的所有方法訪問
。