13.JAVA-包package、import使用


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

數據庫操作包,提供了與各種數據庫操作的工具

 

 

未完待續

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM