1.包的定義
之前我們學習java時,生成的class文件都是位於當前目錄中,假如出現了同名文件,則會出現文件覆蓋問題,因此就需要設置不同的目錄(定義包),來解決同名文件沖突問題.
並且在大型項目中,更加需要模塊化,將不同的模塊保存在不同的包里,然后編譯時再進行一起執行.這樣的代碼將更易於維護,並且支持多人開發.
其實在大型項目里,不同的包里也經常出現同名文件
比如:Linux內核的arch目錄下就定義了很多不同cpu處理器相關的子目錄,然后又在具體的某個cpu子目錄里又有許多不同板卡配置相關的子目錄,並且在每個不同板卡子目錄里都有個board.h(里面根據不同板卡的硬件定義,來配置不同的引腳信息) .
2.package定義包的使用
在java中可以通過package關鍵字來定義包(也就是目錄路徑),該語句需要寫在文件首行.
定義一個包:
package common.demo ; //指定生成的class文件位於common/demo/目錄下 public class Test { public static void main(String args[]){ System.out.println("Hello World"); } }
代碼里出現了package定義后,我們打包編譯時,則必須制定路徑才行,打包編譯方式有以下兩種:
javac -d . Test.java //"-d ."表示生成的包位於當前路徑,所以會在當前路徑下自動創建common/demo/目錄,然后再在該目錄下生成Test .class javac -d . *.java //如果當前目錄有多個java文件,並且互相引用的時候,則用這個命令,*表示編譯所有java文件.
生成的class路徑如下圖所示:
當我們通過java命令來運行上面class包文件時,直接在編譯位置輸入包名+類名:
java common.demo.Test
運行如下:
3.import導入包的使用
之前我們學習了使用package包可以將編譯出來的class進行分開保存,那么如果想不同包之間互相調用,則需要使用import關鍵字來聲明包的入口位置.
3.1 import使用
示例1-調用之前生成的common.demo.Test類(位於./common/demo)
定義一個CallTest.java文件:
import common.demo.Test; //聲明Test包類的位置,等價於import common.demo.*; public class CallTest { public static void main(String args[]){ Test.main(args); //調用Test類的公共靜態方法 } }
編譯運行:
PS: import聲明包的時候,也可以直接使用"包名+*"來聲明包里的所有class類.所以"import common.demo.Test;"等價於"import common.demo.*; ",當然這兩者的導入性能都是一樣的,在運行時,沒有使用的包類則不會被加載.
3.2 如果未使用import聲明的話,在代碼里也可以直接通過包名.類來實現訪問
示例2-修改CallTest.java,不使用import
//import common.demo.Test; //屏蔽import public class CallTest { public static void main(String args[]){ common.demo.Test.main(args); //調用common.demo包里Test類的公共靜態方法 } }
從上面代碼可以看出,這樣寫會顯得麻煩. 並且文件開頭沒有import聲明,如果代碼量多,則非常不方便查找到包類.
3.3 import和package同時使用
如果一個程序package定義了包,並且還需要通過import導入其它包時, 則package必須寫在程序句首,然后import寫在package之后.
示例3- import和package同時使用,並且調用common.demo.Test類
修改CallTest.java文件:
package call; //指定生成的class文件位於call目錄下 import common.demo.*; //聲明common.demo包 public class CallTest { public static void main(String args[]){ Test.main(args); //調用Test類的公共靜態方法 } }
編譯運行:
3.4 import導入多個包里的相同類時
假如我們導入兩個包,該兩個包分別為article.table(桌子)和article.bed(床).
並且該兩個包里都有個相同類Property類,桌子的Property類用標記桌子可以用來辦公,吃飯等,而床的Property類則用來標記床可以睡覺.
由於兩個包的Property類名都相同,則應該使用完整名稱:
import article.table.*; import article.bed.*; public class CallTest { public static void main(String args[]){ article.table.Property obj1 = new article.table.Property(); //實例化一個桌子屬性類 article.bed.Property obj1 = new article.bed.Property(); //實例化一個床屬性類 System.out.println(obj1.toString()); //打印桌子的屬性 System.out.println(obj2.toString()); //打印床的屬性 } }
4.常見的系統包介紹
在java中,除了我們自定義包外,java本身還提供了許多常用的系統包,如下表所示:
包名 |
作用 |
Java.lang |
Language的縮寫,包含了基本數據類型以及包裝類,String類,線程類等,該包由系統默認加載(import). |
Java.lang,reflect |
反射對象包, 該包里提供關於類和對象反射信息的工具,在后續章節學習 |
Java.util |
工具包,提供日期Date類、堆棧Stack類、向量Vector類,鏈表LinkList類, 隨機數Random類等
|
Java.util.regex |
正則工具包,用來匹配字符串 |
Java.text |
處理文本包,用來格式化日期、數字和消息,分析,搜索和排序字符串,以及迭代字符、單詞、語句和換行符等 |
Java.io |
數據流包,處理文件讀寫、標准設備輸出等 |
Java.net |
網絡編程包,里面包含了Socket 類(TCP客戶端,用於連接遠程主機) ServerSocket類(TCP服務端,用來接受客戶端套接字的連接) DatagramSocket類(UDP 端點,用於發送和接收數據包) MulticastSocket 類(是 DatagramSocket 的子類,用來處理廣播) |
Java.sql |
數據庫操作包,提供了與各種數據庫操作的工具 |
未完待續