1.包(package)
包的定義可以理解爲一個文件夾,在這個文件夾內集成了編譯好的class類。
格式:
package 類保存的文件夾位置; |
其中保存的文件夾位置是該java文件所在目錄中。
案例:
package pack.demo.a;
class A
{
public String getInfo()
{
return "hello world !";
}
}
public class TestPackage
{
public static void main(String[] args)
{
A a = new A();
System.out.println(a.getInfo());
}
}
注意:
1、此時在編譯的時候要限定該文件的位置
javac -d . TestPackage.java |
-d . 表示的是java文件所在的位置
2、解釋的時候要把主類所在的位置標註
java pack.demo.a.TestPackage |
更深入的理解package——他主要的作用是讓開發人員確定好自己的主類存放在那個位置,便於不同開發人員同時工作,只用路徑表明出類的不同。
3、定義了包之後,實際上該類的名稱也會發生相應的變化
包.類名。類似於System.out.println
2.包的導入(import)
不同開發人員在相互交互的時候,需要使用別人的類,那麼總不能把每個類都抄過來吧?Java中使用了import關鍵字作爲引用別的class包工具。
格式:
Import 包.類名; (手工導入) 或者 import 包.*; (JVM自動加載) |
以上兩種方式的效率是相同的。
案例:
準備
package pack.demo.b; // 定義包存放的位置
public class A // 定義包便於後續引用,一定要注意該類必須是public
{
public String getInfo()
{
return "hello world !";
}
}
//引用已經存在的類A
package pack.demo.c; //將該類放在c文件下
import pack.demo.b.A ; //引用類A,下面使用類A時候要把前面的路徑帶上
public class TestPackage2
{
public static void main(String[] args)
{
A a = new A();
System.out.println(a.getInfo());
}
}
編譯和解釋的時候注意
javac -d . TestPackage2.java java pack.demo.c.TestPackage2 |
注意:
引用別的類時,這個被引用的類一定要定義爲public,並且import關鍵字後面緊跟着路徑。
案例:
//引用已經存在的類A
package pack.demo.d; //將該類放在c文件下
import pack.demo.b.* ; //如果這個包中有喝多的類
public class TestPackage3
{
public static void main(String[] args)
{
A a = new A();
System.out.println(a.getInfo());
}
}
現在在導入完包之後,直接使用了包中類的名稱,但是如果導入不同的包,而且不同的包只是類名稱不同又該怎麼辦呢?
前期準備
//e包下的B類
package pack.demo.e;
public class B
{
public String getInfo()
{
return "hello world ->class e.B";
}
}
//f包下的B類
package pack.demo.f;
public class B
{
public String getInfo()
{
return "hello world ->class e.B";
}
}
//本例測試的是引用不同包中同名類
package pack.demo.g; // 將該類放在g文件下
import pack.demo.e.* ; // 引用的是e包下的B類
import pack.demo.f.* ; // 引用的是f包下的B類
public class TestPackage5
{
public static void main(String[] args)
{
pack.demo.e.B b1 = new pack.demo.e.B(); // 引用的是e包下的B類
pack.demo.f.B b2 = new pack.demo.f.B(); // 引用的是f包下的B類
System.out.println(b1.getInfo());
System.out.println(b2.getInfo());
}
}
結果
2.靜態導入
在JDK1.5之後,提供了靜態導入。如果類中的屬性和方法全是是static聲明,那麼在被引用時就要使用靜態導入。
格式:
Import static 包.類.* ; |
案例:
準備工作
// 靜態類的定義
package pack.demo.h ; // 放入h包中
public class PubStatic
{
public static int add(int i, int j)
{
return i+j ;
}
public static int sub(int i, int j)
{
return i-j ;
}
public static int mul(int i, int j)
{
return i*j ;
}
public static int div(int i, int j)
{
return i/j ;
}
}
//靜態類的測試
package pack.demo.i; // 將該類放在i文件下
import static pack.demo.h.PubStatic.* ; // 引用的是h包下的靜態類
public class TestPackage6
{
public static void main(String[] args)
{
pack.demo.h.PubStatic aa = new pack.demo.h.PubStatic();
System.out.println("2+1=" + aa.add(2,1)); //也可以直接省略進行引用
System.out.println("2-1=" + aa.sub(2,1));
System.out.println("2*1=" + aa.mul(2,1));
System.out.println("2/1=" + aa.div(2,1));
}
}
2.jar包
在開發完成之後,要把所有的類交給用戶使用,如果此時單單把幾百上千的類給用戶,用戶會瘋掉的,把這些.class壓縮給用戶。
//jar包的測試
package j ;
public class Hello
{
public String getInfo()
{
return "hello" ;
}
}
將其打成jar包
jar cvf Hello.jar j F:\Reliability\java\work\Package>Hello.jar; . 已添加清單 正在添加: j/(輸入 = 0) (輸出 = 0)(存儲了 0%) 正在添加: j/Hello.class(輸入 = 271) (輸出 = 208)(壓縮了 23%) |
這時候可以把外層的j刪除,一個jar包如果想使用的話,則必須配置classpath路徑。
Set classpath =.; F:\Reliability\java\work\Package\Hello.jar
//靜態類的測試
package pack.demo.k; // 將該類放在k文件下
import j.Hello ; // 引用的是之前的類
public class TestPackage7
{
public static void main(String[] args)
{
Hello h = new Hello();
System.out.println(h.getInfo());
}
}