----------- android教育訓練、 java教育訓練、java學習型技術部落格、期待與您交流! ------------
包的概念
在 Java 語言中,為了對同一個項目中的多個類和接口進行分類和管理,專門設計了包的概念,使用包管理類和接口。
其實出現包的概念最開始的原因是避免類名重複,現在這個作用也得到了廣泛的應用。
那麼包到底是什麼呢?其實包是一個邏輯的概念,就是給類名加了一個字首,就像北京路這個路名上海和南京都有,再說這個路名時,就可以使用南京市北京路和上海市北京路進行區分,這裡的北京路就相當于類,而前面的字首,如南京市或上海市,就相當于包名。
在實體上包被轉換成一個檔案夾,作業系統通過檔案夾來管理各個類和接口,進而實作對類的分類,或者稱之為按照類的功能對這些類進行封裝。
下面介紹一下和包有關的兩個文法:打包和引入包。
打包
打包的作用就是将聲明的類放入包中,也就是為類指定包名。在實際的項目中,一般根據類的功能來設定包。
打包的文法格式為:
package 包名 1[.包名 2[.包名 3]];
在該文法中,包名可以設定多個,包名和包名之間使用“.”進行分割,包名的個數沒有限制。其中前面的包名包含後面的包名。按照 Java 語言的編碼規範,包名所有字母都小寫,由于包名将轉換為檔案夾的名稱,是以包名中不能包含特殊字元。
例如:
package test;
package demo.chapter8;
package game.bubble.ui;
在示例中的最後一個, package game.bubble.ui ,該包名将轉換為路徑\game\bubble\ui,也就是前面的包名是後面包名的父目錄。
需要特别注意的是:
1、打包的語句必須是程式代碼中的第一行可執行代碼,也就是說打包語句的上面隻能包含
空行或注釋。
2、打包的語句最多隻有一句。
如果在代碼中沒有書寫 package 語句,則該類将被打入到預設包中,預設包無法被其它的包引用。
示例代碼:
//檔案名:PackageClass.java
package chapter8;
public class PackageClass{
//類内部的代碼
}
通過打包文法,可以為每個類增加一個字首,也就是說以前使用類,使用類名即可,有了包名的概念以後,類的全名就是包名.類名了,通過在類名前面加入包名,可以使不同包中存在相同的類名,但是一般不建議一個項目中的類名存在重複。
當一個類有了包名以後,在編譯和運作時将和前面的操作産生一些變化,下面介紹一下 JDK 和 Eclipse 中相關操作的變化。
a)JDK 編譯和運作打包的源檔案
編譯源代碼的指令:javac –d 類檔案路徑源代碼名稱
例如: javac – dd:\ PackageClass.java
該指令的作用是将 PackageClass 類編譯成 class,并将生成的 class 檔案存儲到 d 盤根目錄下。則 class 檔案的存儲路徑是:d:\chapter8\PackageClass.class。使用該指令編譯時自動将包名轉換為檔案夾。
如果想将編譯生成的 class 檔案生成在源代碼所在的目錄,則可以使用如下格式: javac –d .源檔案名
這裡的源檔案可以使用*.java 代表目前目錄下的所有源檔案。
說明:執行 javac 指令必須将目錄切換到源代碼所在的目錄。
運作類檔案的格式: java 包名.類名
例如:java chapter8.PackageClass
該指令的作用是運作該類,按照上面的編譯指令,運作該程式時,不應該切換到 class 檔案
所在的目錄,而是切換到最頂層的包名所在的目錄,是以執行以上指令時,在控制台下面隻
需要切換到 d 盤根目錄即可。
b)eclipe 編譯和運作打包的源代碼
在建立源代碼時,可以在建立類向導中,可以在 package 欄中添加包名,在 eclipse 編譯時會自動生成包名的結構。運作帶包名的代碼也和以前的運作步驟一樣。
需要特别注意的是:在 eclipse 中,源代碼的組織也要求将包名轉換為檔案夾,否則将出現文法錯誤,這點在複制代碼到 eclipse 項目中時需要特别小心。
引入包
當類進行了打包操作以後,同一個包内部的類預設引入,當需要使用其它包中的類時,則必須首先引入對應的類,然後才可以使用該類。
引入包的文法格式為:
import 包名 1.[.包名 2[.包名 3]].類名|*;
在該文法中,import 關鍵字後面是包名,包名和包名之間使用“.”分割,最後為
類名或“*”,如果書寫類名則代表隻引入該類,如果書寫星号則代表引入該包中的所有類、
接口、異常和錯誤等。
例如:
import chapter8.*;
import java.io.*;
import chapter8. PackageClass;
引入包的代碼書寫在類聲明語句的上面,打包語句的下面,import 語句在一個代
碼中可以書寫任意多句,例如:
package chapter8;
import java.io.*;
import java.net.*;
public class Test{
//其它代碼
}
說明:這裡的 java.io 包和 java.net 包都是 JDK 中提供的包名。
每引入一個類或接口,将在記憶體中占有幾十個位元組的空間,是以使用星号引入一個包中所有的類或接口雖然編寫起來比較簡單,但是卻浪費了一些記憶體,而一個一個的引入類名編寫起來又比較麻煩。
最後需要特别注意的是,import 隻引入目前包下面的類,而不引入該包下面的子
包裡面的類。例如:
//檔案名:A.java
package a;
public class A{}
//檔案名:B.java
package a.b;
public class B{}
//檔案名:Test.java
import a.*;
public class Test{
public static void main(String[] args){
B b = new B();//文法錯誤,B 類未引入
}
}
說明:在該示例的 Test 類中,使用 import a.*;引入了包 a 中的所有類,也就是類
A,而包a的子包 a.b 中的類将不會被引入,是以在 Test 類中使用 B 類将出現文法錯誤。
包的概念小結
總之,包的概念(也就是命名空間)使得類名沖突的問題獲得良好的解決,另外也可以使用包來分類管理一個項目中的多個類,使得項目中的類數量比較多時,結構顯得比較清晰。
到現在為止,綜合以前學習的所有文法知識,規範的類結構的代碼如下:
打包語句
引入語句
類聲明
這也是規範編寫類結構代碼的基礎。 ----------- android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流! ------------