包内包含有一组类,他们在单一的名字空间之下被组织在了一起。
例如,在JAVA的标准发布中有一个工具库,他被组织在java.util名字空间之下。java.util中有一个叫做ArrayList的类,使用ArrayList的一种方式是用其全名java.util.ArrayList来指定。
//access/fullqualification.java
public class fullqualificaiton{
public static void main(String[] args){
java.util.ArrayList list = new java.util.ArrayList();
}
}
在立刻就使程序变得很冗长了,因此你可能想转儿使用import关键字。如果你想导入单个的类,可以在import语句中命名该类:
//:access/SingleImport.java
import java.util.ArrayList;
public class SingleImport{
public static void main(String[] args){
ArrayList list =new java.util.ArrayList();
}
}
现在,就可以不用限定地使用ArrayList了。但是,这样做java.util中的其他类仍旧是都不可以用的。想要导入其中所有的类,只需要使用“*”就像在本书剩余部分的实例中所看到那样:
import java.util.*
我们一所以要导入,就是要提供一个管理名字空间的机制。所有类成员的名称都是彼此隔离的。A类中的方法f()和B类中具有相同特征标记(参数列表)的方法f()不会彼此冲突。但是如果类名称相互冲突又该怎么办?假设你编写了一个stack类并安装到一台机器上,而该机器上已经有了一个别人编写的Statck类,我们该如何解决呢?由于名字之间潜在冲突,在java中对名称空间进行完全控制并为每个类创建唯一的标识符组合就成为了非常重要的事情。
到目前为止,书中大多数示例都存在于单一文件之中,并专为本地使用(local use)而设计,因而尚未收到包名的干扰。这些示例实际上已经位于包中了:即未命名包,或成为默认包,这当然也是一种选择,而且为了简单起见,以后很多地方都尽可能的使用了此方法,不过如果你正在编写对在同一台机器上共存的其他java程序友好的类库或程序的话,就需要考虑如何防止类名称之间的冲突问题。
当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元)。每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件名相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为他们不是public类,而且他们主要用来主public类提供支持。
网友评论