Java基础教程之包(package)
我们已经写了一些Java程序。之前的每个Java程序都被保存为一个文件,比如Test.java。随后,该程序被编译为Test.class。我们最终使用$java Test来运行程序。
然而,在一个正常的Java项目中,我们往往需要编写不止一个.java程序,最终的Java产品包括了所有的Java程序。因此,Java需要解决组织Java程序的问题。包(package)的目的就是为了更好的组织Java程序。
包的建立
包的建立非常简单。我们只用在Java程序的开始加入package就可以了。我们以Human类为例,将它放入包中:
package com.vamei.society;
public class Human
{
/**
* constructor
*/
public Human(int h)
{
this.height = h;
System.out.println("I'm born");
}
/**
* accessor
*/
public int getHeight()
{
return this.height;
}
/**
* mutator
*/
public void growHeight(int h)
{
this.height = this.height + h;
}
private int height;
}
上面的第一行语句
package com.vamei.society;
表示该程序在com.vamei.society包中。com.vamei(vamei.com的反写)表示包作者的域名 (很可惜,这个域名已经被别人注册了,所以只起演示作用)。Java要求包要有域名前缀,以便区分不同作者。society为进一步的本地路径名。com.vamei.society共同构成了包的名字。
包为Java程序提供了一个命名空间(name space)。一个Java类的完整路径由它的包和类名共同构成,比如com.vamei.society.Human。相应的Human.java程序要放在com/vamei/society/下。类是由完整的路径识别的,所以不同的包中可以有同名的类,Java不会混淆。比如com.vamei.society.Human和com.vamei.creature.Human是两个不同的类。
再看一个细节。Human类是public的,其构造方法也是public的,所以任意其他对象都可以调用该类。我们之前说过,一个Java文件中只能有一个public的类,该类要去.java文件同名。一个类可以没有public关键字,它实际上也表示一种权限: 该类在它所在的包中可见。也就是说,包中的其他Java程序可以访问该类。这是Java中的默认访问权限。
同样,对象的成员也可以是默认权限(包中可见)。比如我们去掉getHeight()方法前面的public关键字。
包的调用
我们只需要将Human.java编译的Human.class放入相应的文件夹就可以了。比如,我将Human.class放入com/vamei/society/中。实际上,你也可以把.java文件放入相应路径,Java会在使用时自动编译。
如果整个包(也就是com文件夹)位于当前的工作路径中,那么不需要特别的设置,就可以使用包了,比如下面的TestAgain.java:
import com.vamei.society.*;
public class TestAgain
{
public static void main(String[] args)
{
Human aPerson = new Human(180);
System.out.println(aPerson.getHeight());
}
}
import用于识别路径。利用import语句,我们可以引入相应路径下的类。*表示引入society文件夹下的所有类。在TestAgain中,我们直接使用了Human类。
我们也可以提供类的完整的路径。这可以区分同名但不同路径的类,比如:
public class TestAgain
{
public static void main(String[] args)
{
com.vamei.society.Human aPerson =
new com.vamei.society.Human(180);
System.out.println(aPerson.getHeight());
}
}
由于我们提供了完整的类路径,所以不需要使用import语句。