java -- 包與導包
java 包與導包
包-package
1.package 使用規範
java中使用 package 來定義包。在一個原始檔中,package 最多出現一次,且必須在第一行。
// 註釋
package 包名; // 頂行或第一行程式碼,只能出現一次
// package 包名;// 編譯出錯:錯誤: 需要 class、interface、enum 或 record
// 原始碼塊
2.編譯package
package 是與 javac 編譯命令配合使用的,為的是將java檔案和class檔案分開管理。
(1)package 後面的包名即是目錄名,用 . 號分開。
package com.test.package1;
(2)javac 編譯成功之後的類檔案存放位置 由 -d 所指路徑 和 package 所指包名決定:路徑/包名/類.class
javac -d . PackageTest1.java //將 class 放到 ./com/test/package1 目錄下
javac -d . *.java // 編譯 . 路徑下所有 java 檔案,並放到 .包名 路徑下
3.執行package
執行 含有 package 的類必須使用包名。-cp 指明包所在位置,與-d同。
java -cp 路徑 包名.類名
注意:
1、包名只能是 package 所指的包名
2、-cp 所指地址必須與 -d 相同。
3、不承認任何形式的包名路徑拆分。
4、否則會報錯:主類找不到。
java -cp . com.test.package1.PackageTest1 //正確
java -cp com test.package1.PackageTest1 //報錯:找不到主類 PackageTest1
//如果你在 .com目錄下, 下面也是正確的。關鍵:包名、-cp所指的路徑正確。
java -cp .. com.test.package1.PackageTest1
導包-import
1.import使用方法
java中使用 import 來導包。導包一般是為了簡寫程式碼,但當類名重複時,導包失效,編譯時不報錯,執行時報錯。
使用方法:
import 匯入的目標物件只能是類,導包只是一種習慣說法。而包必須是包含有類的資料夾。
import 後必須跟 包名.類名 或 包名.* (匯入包中所有類)
而且包名必須是 類名原始檔中 package 指定的包名
import java.util.Scanner // 導包必須寫在類定義之前
// import java.util.* // 匯入所有類
//import java.util // 編譯報錯,認為 util 是類,java 是包,報錯 java 包不存在。
// 類定義
// 不使用導包
java.util.Scanner sc = new java.util.Scanner(System.in);
// 使用導包
Scanner sc = new Scanner(System.in);
2.匯入系統包
系統預設匯入 java.lang 包下所有類。
import java.lang.*
系統包的匯入基本以 java 或 jdk 開頭。可以檢視幫助文件。
3.匯入自定義包
(1)包名
包名為所導類 package 所指的完整包名。其他包名一律不承認。
// 打包
package com.test
class Import1 {}
// 導包,包名必須與 package 的一致,其他包名一律無效。
import com.test.Import1
(2)導包的編譯
系統尋找使用者自定義包的路徑由環境變數 CLASSPATH 決定。當未設定CLASSPATH,預設為當前路徑,也可由 --class-path 引數指定,多個導包路徑用 ; 隔開。
javac --class-path .;導包路徑 java檔案
(3)導包的執行
編譯導包語句並沒有將類複製過來,class檔案中還是一個導包語句。所以執行class檔案仍然需要指定包所在位置。由引數 -cp 或 -classpath指定,多個導包路徑用 ; 隔開。
java -cp .;.. 類名 // -cp 中必須要有執行的class檔案所在路徑,否則會找不到主類。
(-cp 和 -classpath 二選一,同時出現時,由位置靠後的引數決定)
總結
包的編譯
javac -d . *.java //編譯當前路徑下所有java檔案,將 class 檔案放到 .包名 目錄下
包的執行
java -cp 包名所在路徑 包名.類名
導包的編譯
javac --class-path .;導包路徑 java檔案
導包的執行
java -cp .;導包路徑 類名
編譯執行有導包的包
// 引數位置不能換
javac --class-path .;導包路徑 -d . *.java //從當前路徑和導包路徑中導包,將 class 檔案放到 .包名 目錄下
java -cp .;導包路徑 包名.類名 // 從當前路徑和導包路徑中 導包、尋找主類
總結
三個引數
-d 決定包的儲存路徑
--class-path 導包的路徑
-cp 主類路徑、導包路徑
感覺很麻煩不是嗎?試想如果工程的目錄結構複雜,那麼專案的編譯與執行得變得多麼困難。