day8 8、java裏的包及靜態導入

1.1 包(package)

1.1.1 什麼是包

在編寫 Java 程序時,隨着程序架構越來越大,類的個數也越來越多,這時就會發現管理程序中維護類名稱也是一件很麻煩的事,尤其是一些同名問題的發生。有時,開發人員還可能需要將處理同一方面的問題的類放在同一個目錄下,以便於管理。

爲了解決上述問題,Java 引入了包(package)機制,提供了類的多層命名空間Java; 使用包(package)這種機制是爲了防止命名衝突,訪問控制,提供搜索和定位類(class)、接口、枚舉(enumerations)和註釋(annotation)等。

包允許將類組合成較小的單元(類似文件夾),它基本上隱藏了類,並避免了名稱上的衝突。包允許在更廣泛的範圍內保護類、數據和方法。你可以在包內定義類,而在包外的代碼不能訪問該類。這使你的類相互之間有隱私,但不被其他世界所知。

1.1.2 包的作用

包的 3 個作用如下:

  1. 區分相同名稱的類。
  2. 能夠較好地管理大量的類。
  3. 控制訪問範圍。

1.1.3 包的定義

Java 中使用 package 語句定義包,package 語句應該放在源文件的第一行,在每個源文件中只能有一個包定義語句,並且 package 語句適用於所有類型(類、接口、枚舉和註釋)的文件。定義包語法格式如下:

package 包名;

Java 包的命名規則如下:

  1. 包名全部由小寫字母(多個單詞也全部小寫)。
  2. 如果包名包含多個層次,每個層次用“.”分割。
  3. 包名一般由倒置的域名開頭,比如 com.baidu,不要有 www。
  4. 自定義包不能 java 開頭。

注意:如果在源文件中沒有定義包,那麼類、接口、枚舉和註釋類型文件將會被放進一個無名的包中,也稱爲默認包。在實際企業開發中,通常不會把類定義在默認包下。

1.1.4 包導入

如果使用不同包中的其它類,需要使用該類的全名(包名+類名)。代碼如下:

example.Test test = new example.Test();

其中,example 是包名,Test 是包中的類名,test 是類的對象。

爲了簡化編程,Java 引入了 import 關鍵字,import 可以向某個 Java 文件中導入指定包層次下的某個類或全部類。import 語句位於 package 語句之後,類定義之前。一個 Java 源文件只能包含一個 package 語句,但可以包含多個 import 語句。

使用 import 導入單個類的語法格式如下:

import 包名+類名;

上面語句用於直接導入指定類,例如導入前面的 example.Test 類,代碼如下:

import example.Test;

使用 import 語句導入指定包下全部類的用法按如下:

import example.*;

上面 import 語句中的星號(*)只能代表類,不能代表包,表明導入 example 包下的所有類。

提示:使用星號(*)可能會增加編譯時間,特別是引入多個大包時,所以明確的導入你想要用到的類是一個好方法,需要注意的是使用星號對運行時間和類的大小沒有影響。

通過使用 import 語句可以簡化編程,但 import 語句並不是必需的,如果在類裏使用其它類的全名,可以不使用 import 語句。

Java 默認爲所有源文件導入 java.lang 包下的所有類,因此前面在 Java 程序中使用 String、System 類時都無須使用 import 語句來導入這些類。但對於前面介紹數組時提到的 Arrays 類,其位於 java.util 包下,則必須使用 import 語句來導入該類。

在一些極端的情況下,import 語句也幫不了我們,此時只能在源文件中使用類全名。例如,需要在程序中使用 java.sql 包下的類,也需要使用 java.util 包下的類,則可以使用如下兩行 import 語句:

import java.util.*;
import java.sql.*;

如果接下來在程序中需要使用 Date 類,則會引起如下編譯錯誤:
Test.java:25:對Date的引用不明確,
java.sql中的類java.sql.Date和java.util中的類java.util.Date都匹配

上面錯誤提示:在 Test.java 文件的第 25 行使用了 Date 類,而 import 語句導入的 java.sql 和 java.util 包下都包含了 Date 類,系統不知道使用哪個包下的 Date 類。在這種情況下,如果需要指定包下的 Date 類,則只能使用該類的全名,代碼如下:
// 爲了讓引用更加明確,即使使用了 import 語句,也還是需要使用類的全名
java.sql.Date d = new java.sql.Date();

1.1.5 包的分類

系統包
Java SE 提供了一些系統包,其中包含了 Java 開發中常用的基礎類。在 Java 語言中,開發人員可以自定義包,也可以使用系統包,常用的系統包如表 1 所示。

說明
java.lang Java 的核心類庫,包含運行 Java 程序必不可少的系統類,如基本數據類型、基本數學函數、字符串處理、異常處理和線程類等,系統默認加載這個包
java.io Java 語言的標準輸入/輸出類庫,如基本輸入/輸出流、文件輸入/輸出、過濾輸入/輸出流等
java.util 包含如處理時間的 Date 類,處理動態數組的 Vector 類,以及 Stack 和 HashTable 類
java.awt 構建圖形用戶界面(GUI)的類庫,低級繪圖操作 Graphics 類、圖形界面組件和佈局管理(如 Checkbox 類、Container 類、LayoutManger 接口等),以及用戶界面交互控制和事件響應(如 Event 類)
java.awt.image 處理和操縱來自網上的圖片的 Java 工具類庫
java.wat.peer 很少在程序中直接用到,使得同一個 Java 程序在不同的軟硬件平臺上運行
java.net 實現網絡功能的類庫有 Socket 類、ServerSocket 類
java.lang.reflect 提供用於反射對象的工具
java.util.zip 實現文件壓縮功能
java.awt.datatransfer 處理數據傳輸的工具類,包括剪貼板、字符串發送器等
java.sql 實現 JDBC 的類庫
java.rmi 提供遠程連接與載入的支持
java. security 提供安全性方面的有關支持

用戶自定義包

1.1.7 帶包的類的編譯

在這裏插入圖片描述

1.2 靜態導入(import static)

靜態導入使用 import static 語句
靜態導入也有兩種語法,分別用於導入指定類的單個靜態成員變量、方法和全部靜態成員變量、方法。
1)導入指定類的單個靜態成員變量、方法的語法格式如下:

import static package.ClassName.fieldName|methodName;

上面語法導入 package.ClassName 類中名爲 fieldName 的靜態成員變量或者名爲 methodName 的靜態方法。例如,可以使用import static java.lang.System.out;語句來導入 java.lang.System 類的 out 靜態成員變量。

2) 導入指定類的全部靜態成員變量、方法的語法格式如下:

import static package.ClassName.*;

上面語法中的星號只能代表靜態成員變量或方法名。

import static語句的位置

import static 語句也放在 Java 源文件的 package 語句(如果有的話)之後、類定義之前,即放在與普通 import 語句相同的位置,而且 import 語句和 import static 語句之間沒有任何順序要求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章