java的包:库单位
我们用import要害字导入一个完整的库时,就会得到“包”(Package)。譬喻:
import java.util.*;
它的浸染是导入完整的实用东西(Utility)库,该库属于尺度Java开拓东西包的一部门。由于Vector位于java.util里,所以此刻要么指定完整名称“java.util.Vector”(可省略import语句),要么简朴地指定一个“Vector”(因为import是默认的)。
若想导入单唯一个类,可在import语句里指定谁人类的名字:
import java.util.Vector;
此刻,我们可以自由地利用Vector。然而,java.util中的其他任何类仍是不行利用的。
之所以要举办这样的导入,是为了提供一种非凡的机制,以便打点“定名空间”(Name Space)。我们所有类成员的名字彼此间城市断绝起来。位于类A内的一个要领f()不会与位于类B内的、拥有沟通“签名”(自变量列表)的f()产生斗嘴。但类名会不会斗嘴呢?假设建设一个stack类,将它安装到已有一个stack类(由其他人编写)的呆板上,这时会呈现什么环境呢?对付因特网中的Java应用,这种环境会在用户绝不知晓的时候产生,因为类会在运行一个Java措施的时候自动下载。
正是由于存在名字潜在的斗嘴,所以出格有须要对Java中的定名空间举办完整的节制,并且需要建设一个完全唯一无二的名字,无论因特网存在什么样的限制。
迄今为止,本书的大大都例子都仅存在于单个文件中,并且设计成局部(当地)利用,没有同包名产生斗嘴(在这种环境下,类名置于“默认包”内)。这是一种有效的做法,并且思量到问题的简化,本书剩下的部门也将尽大概地回收它。然而,若打算建设一个“对因特网友好”可能说“适合在因特网利用”的措施,必需思量如何防备类名的反复。
为Java建设一个源码文件的时候,它凡是叫作一个“编辑单位”(有时也叫作“翻译单位”)。每个编译单位都必需有一个以.java末了的名字。并且在编译单位的内部,可以有一个民众(public)类,它必需拥有与文件沟通的名字(包罗巨细写形式,但解除.java文件扩展名)。假如不这样做,编译器就会陈诉堕落。每个编译单位内都只能有一个public类(同样地,不然编译器会陈诉堕落)。谁人编译单位剩下的类(假如有的话)可在谁人包外面的世界眼前埋没起来,因为它们并非“民众”的(非public),并且它们由用于主public类的“支撑”类构成。
编译一个.java文件时,我们会得到一个名字完全沟通的输出文件;但对付.java文件中的每个类,它们都有一个.class扩展名。因此,我们最终从少量的.java文件里有大概得到数量浩瀚的.class文件。如以前用一种汇编语言写过措施,那么大概已习惯编译器先支解出一种过渡形式(凡是是一个.obj文件),再用一个链接器将其与其他对象封装到一起(生成一个可执行文件),可能与一个库封装到一起(生成一个库)。但那并不是Java的事情方法。一个有效的措施就是一系列.class文件,它们可以封装和压缩到一个JAR文件里(利用Java 1.1提供的jar东西)。Java表明器认真对这些文件的寻找、装载息争释(注释①)。
①:Java并没有强制必然要利用表明器。一些固有代码的Java编译器可生成单独的可执行文件。
“库”也由一系列类文件组成。每个文件都有一个public类(并没强迫利用一个public类,但这种环境最很典范的),所以每个文件都有一个组件。假如想将所有这些组件(它们在各自独立的.java和.class文件里)都归纳到一起,那么package要害字就可以发挥浸染)。
若在一个文件的开头利用下述代码:
package mypackage;
那么package语句必需作为文件的第一个非注释语句呈现。该语句的浸染是指出这个编译单位属于名为mypackage的一个库的一部门。可能换句话说,它表白这个编译单位内的public类名位于mypackage这个名字的下面。假如其他人想利用这个名字,要么指出完整的名字,要么与mypackage连系利用import要害字(利用前面给出的选项)。留意按照Java包(封装)的约定,名字内的所有字母都应小写,甚至那些中间单词亦要如此。
譬喻,假定文件名是MyClass.java。它意味着在谁人文件有一个、并且只能有一个public类。并且谁人类的名字必需是MyClass(包罗巨细写形式):
package mypackage;
public class MyClass {
// . . .
此刻,假如有人想利用MyClass,可能想利用mypackage内的其他任何public类,他们必需用import要害字激活mypackage内的名字,使它们可以或许利用。另一个步伐则是指定完整的名称:
mypackage.MyClass m = new mypackage.MyClass();
import要害字则可将其变得简捷得多:
import mypackage.*;
// . . .
MyClass m = new MyClass();
作为一名库设计者,必然要记着package和import要害字答允我们做的工作就是支解单个全局定名空间,担保我们不会碰着名字的斗嘴——无论有几多人利用因特网,也无论几多人用Java编写本身的类。