1. 程式人生 > 其它 >java -- 包與導包

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 主類路徑、導包路徑

感覺很麻煩不是嗎?試想如果工程的目錄結構複雜,那麼專案的編譯與執行得變得多麼困難。