一個java包是一組相似類型的類,接口和子包。java中的包可以分為兩種形式,內(nèi)置包和用戶定義包。
java中有很多內(nèi)置的包,如:java,lang,awt,javax,swing,net,io,util,sql等。
在這里,我們將詳細(xì)學(xué)習(xí)創(chuàng)建和使用用戶定義的包。
Java包的優(yōu)點(diǎn)

java包的簡單示例
package關(guān)鍵字用于在java中創(chuàng)建一個包。
//save as Simple.java
package com.yiibai;
public class Simple {
public static void main(String args[]) {
System.out.println("Welcome to package");
}
}
如何編譯java包
如果您沒有使用任何IDE,則需要遵循以下語法:
javac -d directory javafilename
例如
javac -d . Simple.java
-d 指定放置生成的類文件的目標(biāo)位置。 您可以使用任何目錄名稱,如/home(在Linux的情況下),D:\workspace(在Windows的情況下)等。如果想保持包在同一目錄,可以使用.(點(diǎn))表示當(dāng)前目錄。
如何運(yùn)行java包程序
您需要使用完全限定(指定)名稱。如:com.yiibai.Simple等來運(yùn)行類。
編譯:javac -d . Simple.java
運(yùn)行:java com.yiibai.Simple
輸出結(jié)果如下 -
Welcome to package
-d是一個開關(guān),它告訴編譯器放置類文件的位置,即它代表目的地。 .(點(diǎn)符號)表示當(dāng)前文件夾。
如何從一個包中訪問另一個包?
有三種方法從包外部來訪問一個包。它們分別如下 -
如果使用package.*,那么這個包的所有類和接口都是可訪問的,而不是子包。import關(guān)鍵字用于使當(dāng)前包可訪問的另一個包的類和接口。
導(dǎo)入packagename的包的示例。
一個Java文件:A.java,在 pack 包下。
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Hello");}
}
另一個Java文件:B.java,在 mypack 包下,下面看看它是如何引用 pack 包中的 A.java 這個類。
//save by B.java
package mypack;
import pack.*;
class B{
public static void main(String args[]){
A obj = new A();
obj.msg();
}
}
執(zhí)行上面代碼,輸出結(jié)果如下 -
Hello
如果要導(dǎo)入package.classname,那么只有這個包的類聲明為可訪問的。
通過導(dǎo)入package.classname的包的示例
以下是 A.java 文件中的代碼 -
//save by A.java
package pack;
public class A{
public void msg(){System.out.println("Hello");}
}
以下是 B.java 文件中的代碼 -
//save by B.java
package mypack;
import pack.A;
class B {
public static void main(String args[]) {
A obj = new A();
obj.msg();
}
}
執(zhí)行上面代碼,輸出結(jié)果如下 -
Hello
如果使用完全限定名,那么只有這個包的聲明類將可訪問。現(xiàn)在沒有必要導(dǎo)入,但是需要在每次訪問類或接口時使用完全限定名。
它通常用于兩個包具有相同類名的情況。 java.util和java.sql包包含Date類。
通過導(dǎo)入完全限定名稱的包的示例
創(chuàng)建一個Java文件:A.java,其代碼如下所示 -
//save by A.java
package pack;
public class A {
public void msg() {
System.out.println("Hello");
}
}
創(chuàng)建另一個Java文件:B.java,其代碼如下所示 -
//save by B.java
package mypack;
class B {
public static void main(String args[]) {
pack.A obj = new pack.A();// using fully qualified name
obj.msg();
}
}
執(zhí)行上面代碼,得到以下結(jié)果 -
Hello
注意:如果導(dǎo)入包,則不會導(dǎo)入子包。
如果導(dǎo)入包,則將導(dǎo)入該包的所有類和接口,但不包括子包的類和接口。 因此,您還需要導(dǎo)入子包。
注意:程序的序列必須先是包,然后再導(dǎo)入類。

包內(nèi)的包稱為子包。創(chuàng)建它用以進(jìn)一步分類包。
舉個例子,Sun Microsystem定義了一個名為java的包,其中包含了很多類,比如System,String,Reader,Writer,Socket等。 Reader和Writer類用于輸入/輸出操作,Socket和ServerSocket類用于網(wǎng)絡(luò)等等。 所以,Sun已經(jīng)將java包子類化為子包,如:lang,net,io等,并將輸入/輸出相關(guān)類放在io包中,將Server和ServerSocket類放在net包中等等。
注:定義包的標(biāo)準(zhǔn)是
domain.company.package,例如:com.yiibai.bean或org.apache.dao。
子包示例
package com.yiibai.core;
class Simple {
public static void main(String args[]) {
System.out.println("Hello subpackage");
}
}
編譯執(zhí)行的命令:javac -d . Simple.java
運(yùn)行執(zhí)行的命令:java com.yiibai.core.Simple
Hello subpackage
如何將類文件發(fā)送到另一個目錄或驅(qū)動器?
有一個場景,想要把A.java源文件的類文件放在C 盤的classes文件夾中。 例如:

首先在 E:\source 目錄中創(chuàng)建 A.java 文件,如下代碼 -
//save as Simple.java
package mypack;
public class Simple {
public static void main(String args[]) {
System.out.println("Welcome to package");
}
}
編譯:
E:\sources> javac -d c:\classes Simple.java
運(yùn)行:
要在E:\source目錄運(yùn)行此程序,需要設(shè)置類文件所在目錄的類路徑。
e:\sources> set classpath=c:\classes;.;
e:\sources> java mypack.Simple
另一種方式運(yùn)行這個程序通過 -classpath切換java:
-classpath切換可以與javac和java工具一起使用。
要在E:\source目錄運(yùn)行此程序,可以使用java的-classpath選項(xiàng),告訴在哪里查找類文件。 例如:
e:\sources> java -classpath c:\classes mypack.Simple
執(zhí)行上面代碼,得到以下結(jié)果 -
Welcome to package
加載類文件或jar文件的方式
有兩種方法用來臨時和永久加載類文件。
加載臨時類文件
-classpath 開關(guān)選項(xiàng)永久加載類文件
jre/lib/ext文件夾中。規(guī)則:在java源文件中只能有一個公共類,它必須以公共類的名稱保存。
//save as C.java otherwise Compilte Time Error
class A {
}
class B {
}
public class C {
}
如何將兩個公共類放在包中?
如果想把兩個公共類放在同一個包中,有兩個java源文件都包含一個公共類,只需保持包名稱相同即可。 例如:
文件:A.java,代碼如下所示 -
//save as A.java
package yiibai;
public class A{}
文件:B.java,代碼如下所示 -
//save as B.java
package yiibai;
public class B{}