1.爲什麼需要包
默認情況下編譯一個.java文件,編譯之後該文件中的每個類都會生成一個<類名>.class文件,我們可以直接通過類名找到這個類,比如:
class A
{
public void fun()
{
System.out.println("Hello");
}
}
class TestA
{
public static void main(String[] args)
{
A a1 = new A();
a1.fun();
}
}
編譯:
javac TestA.java
編譯完成後源文件的目錄下生成的類文件如下:
直接使用java <類名>
即可運行該類(前提是該類是主類,有main方法):
爲了更好的管理類,Java中提供了包管理方式。
2.包的使用方式
2.1.包的聲明
- 必須在文件的第一行使用
package
關鍵字聲明該文件中所有的類所在的包; - 可以使用
.
表示包層(比如packge a.b表示該文件中的類位於包a中的包b中);
比如之前的文件要聲明包,在代碼開頭添加一行代碼,聲明該文件中的類屬於包Test:
package Test; //聲明在該文件中的類在包Test中
class A
{
public void fun()
{
System.out.println("Hello");
}
}
class TestA
{
public static void main(String[] args)
{
A a1 = new A();
a1.fun();
}
}
2.2.編譯運行含有包層的類
聲明之後不可直接使用類名找到該類並運行,要通過<包名>.<類名>
找到該類。
比如
package Test;
再次編譯:
javac TestA.java
編譯之後生成的類文件還是和之前一樣,但是直接訪問類會出錯:
再使用<包名>.<類名>
訪問:
依然會出錯,這是爲什麼呢?
我們雖然在文件中使用package
聲明瞭包,但是因爲在編譯時沒有加入自動生成包層的參數,所以不會自動組織文件,需要手動組織文件。
在源文件目錄下新建一個文件夾Test
表示Test
包,然後將生成的.class文件
放到該包的文件中:
然後再次使用<包名>.<類名>訪問,成功訪問到主類:
上面的步驟需要自己手動名建立文件夾和包層對應,這樣的過程過於麻煩,使用Javac編譯器編譯時,可以直接加入-d .
參數,表示在當前目錄下自動建立包層。
javac -d . TestA.java
3.同包和不同包類的相互訪問
3.1.訪問權限
- 在同一個包中:只有私有的成員不能被訪問,也只有私有的成員不能被繼承;
- 在不同包中,如果無任何關係:只有public類的public成員纔可以被外部的包訪問;
- 在不同包中,如果有繼承關係:
- 在子類內部:只有public類的public成員和protect成員可以被訪問;
- 在子類外部:只有public類的public成員可以被訪問;
3.2.如何使用不同包中的類
使用不同包中的類時,需要提前使用import關鍵字將包中的類導入:
import <包名>.*; //將該包中所有的類都導入
import <包名>.<類名>; //將該包中指定的類導入
4.歸檔工具jar
4.1..jar
文件
Java歸檔工具是jdk中提供的一種多用途的存檔及壓縮工具,可以將多個文件或目錄合併爲一個.jar歸檔文件。
.jar
文件的主要作用有:
- 發佈和使用類庫;
- 便於資源的組合和管理;
4.2.如何打包
- 將需要打包的文件放在一個乾淨的的文件夾下;
- 命令行進入該文件夾;
- 使用命令打包:
jar cvf <包名>.jar *
其中:
- jar是jdk中的打包工具;
- cvf是打包固定參數:c表示打包,v表示打包時輸出信息,f表示打包的是文件;
- <打包後的文件名>.jre表示打包後的文件名;
- *表示將該文件夾下的所有文件打包;
4.3.如何打開/運行
- 使用解壓縮工具或者jar工具使用xvf參數解壓:
.jar
包中無啓動類; - 命令行運行:
.jar
包中含有啓動類(有main方法); - 雙擊運行:
.jar
包中含有啓動類(有main方法),並且創建了圖形化用戶界面;
注:
如果我們僅僅想在別的文件中使用jar包中的類,需要將jar文件放置在該文件的目錄下,否則,需要在classpath
環境變量中設置jar文件及其所在目錄(需要將.jar文件也設置進去);
接收更多精彩文章及資源推送,歡迎訂閱我的微信公衆號:『mculover666』。