不错的文章,转载下,别忘记了。
Java中的软件包
由于所有的Java类组合在一块形成软件包,所以,没有它们将什么也做不了。
本章先概览Java软件包的语法和语义,接下去讨论Java和Visual J++的一些软件包。读者可能已经注意到,实际上,编程已经用到的类都包含在这些预定义的软件包中。使用现成的软件包比创建新的软件包要普遍,但是,有时用户也需要创建自己的软件包,所以,这里将举例说明怎样实现自己创建软件包。
在文章中,读者可以学习到:
*软件包和文件夹的关系;
*Java中的固有软件包;
*Windows Foundation Class(WFC,窗口基类)的框架结构和WFC的软件包;
*创建用户自己的软件包。
---------------------用户将创建:-----------------------------
*能从剪贴板上读取字符串和把字符串写到剪贴板的应用程序;
*一个时钟应用程序;
*一个实用程序:包含一个能对两个数进行求和的简单类。
-----------------------------
什么是软件包
软件包是Java最主要的组织实体,它从逻辑上把相关类组合到一起,还定义了类之间的一种访问形式。每个应用程序都有一个默认的软件包,它包含了代码中引用到的所有软件包。
定义一个类作为命名数据包的成员
*在源代码中的第一行包含“package”语句:
package pkgname;
pkgname的取值就是软件包的名称,它必须同源代码所在的文件夹名或目录名匹配,下面是MyStuff软件包的package语句:
package MyStuff;
package语句必须出现在源代码的开头,它前头只允许有空行和注释。package语句对在源代码文件中定义的所有类都适用。
软件包和文件系统
软件包和文件系统有密切的关系,这种关系是公用类和文件联系的纽带。
公用类必须存放在与它同名的文件中,这就是说,取名MyClass的公用类必须存放在名为MyClass.java的源代码文件中。
包含package语句的文件也必须存放在同名的文件夹中,比如,下面这几行代码表明:名称为MyStuff的文件夹中有名称为MyClass.java的文件:
package MyStuff;
public class MyClass
类文件的位置也很重要,编译这个源代码文件创建两个类文件,MyClass.class和MyHelper.class,这些类文件必须存放在命名为MyStuff的文件夹中:
package MyStuff;
public class MyClass
{
...
}
class MyHelper
{
...
}
生成两个类文件MyClass.class和MyHelper.class。这些类文件一定在名字为MyStuff的文件夹中。软件包的名称可以包含多个由英文句号分隔的标识符;名称的每一部分隐含着一个独立的文件夹。比如,下面的代码表明:名称为MySubPackage的文件夹中有名称为MyClass的文件,还有,MySubPackage文件夹在MyStuff文件夹中。
package MyStuff.MySubPackage;
public class Myclass
{
...
}
软件包的名称表明一个存放在特定路径下的特定的软件包,存放在不同文件夹中的同名的软件包之间、或者不同软件包中同名的类之间都没有特殊的关系;在上面的第一个例子中,软件包的名称是MyStuff,第二个例子中软件包的名称是MyStuff.MySubPackage。一个软件包可以存放在另外一个软件包的子文件夹中,但是,这两个软件包中的类却没有关系;类似的,MyStuff.MyClass和MyStuff.MySubPackage.MyClass这两个类之间也没有特殊的关系。
类路径
类路径是一些文件夹(或目录)的序列,这些文件夹组合起来形成一个应用程序的默认软件包;所有命名的软件包都可以在类路径上文件夹的子文件夹中找到,软件包文件夹是类路径文件夹的一个子文件夹。比如,假定类路径由下面的文件夹组成:
C:\Windows\Java\Classes
C:\Windows\Java\Lib
C:\MyLibrary
类文件C:\Windows\Java\Classes\Utilities.class就直接存放在默认的软件包中。
现在,假定通过编译下面命名为MyClass.class文件中的几行代码来创建一个类路径上的类文件:
package MyStuff;
public class MyClass
{
...
}
MyStuff.MyClass文件可能在以下文件夹的任意一个当中:
C:\Windows\Java\Classes\MyStuff*C:\windows\Java\Lib\MyStuff
C:\MyLibrary\MyStuff
另外,大多数的Java虚拟机(VM)能够使用以ZIP、JAR或CAB形式存储的类文件,不过,这些ZIP、JAR或CAB文件必须显式地列在类路径当中;这些压缩文件可以包含别的文件,也可以包含带有许多子文件夹的文件夹的信息。
可以用下面两个文件夹来更新类路径:
C:\Windows\Java\Classes\Classes.ZIP
C:\Library\MyClasses.CAB
现在,类文件MyClass.class可能出现在Classes.Zip或者MyClasses.CAB中。如果它包括在MyClasses.CAB中,则把它保存在子文件夹MyStuff中。
访问控制
跟访问有关的三个访问修饰字:public(公共),private(私有)和protected(保护)。
我们已经介绍过没有关联关键字的第四种访问方式:default access(默认访问);具有默认访问的项只能被在同一软件包中定义的项访问;由于它只给相同软件包中的成员分配访问权限,所以也称它为软件包访问(package access)。比如,在下面的代码中,一个类和一个方法是公共的,同时它们都有默认访问:
package MyStuff;
public class MyClass
{
public void getMoreStuff()
{
...
}
void doSomeMore()
{
...
}
}
class Helper
{
}
通过上面的介绍可以知道,下面的说法都是正确的:
*任意类都可以定义MyStuff.MyClass类型的成员变量;
*任意类中的方法可以定义MyStuff.MyClass类型的局部变量;
*如果给定一个MyStuff.MyClass对象,则任意类中的方法可以调用getMoreStuff方法;
*只有在MyStuff软件包中的类才可以定义MyStuff.Helper类型的成员变量;
*只有在MyStuff软件包的类中的方法才可以定义MyStuff.Helper类型的局部变量;
*如果给定一个MyStuff.MyClass对象,则只有在MyStuff软件包中的类中的方法才可以调用doSomeMore方法。
有了默认访问或软件包访问,软件包的的创建者就可以定义只能被相同软件包中的其他类进行访问的类、方法和成员变量。
Java软件包
我们来快速浏览一遍Java VM自带的一些软件包。这些包是作为以“java.”开头的可移植、扩展的Java库的一个标准部分发布的;下面将详细地介绍java.lang软件包,并汇总说明其他八个软件包。
Java.lang软件包
Java语言的核心部分就是java.lang软件包,它定义了Java中的大多数基本的类。它的核心地位是显然的:每一个Java源代码文件都引入了java.lang类中的语句:
import java.lang.*;
java.lang软件包包含了Object(目标)类,java.lang.Object类式Java中整个类层次结构的根节点,这个软件包还定义了基本数据类型的类:
String Boolean
Character Byte
Integer Short
Long Float
Double
这些类支持数字型的转换和字符串操作,在前面的章节里已经详细地介绍了这些内容。定义在java.lang中的其他一些类列在下表中
java.lang软件包中定义的几个重要的类
--------------------------
java.lang的类 说明
--------------------------
Class 为运行时搜集的信息救鏸nstanceof操作符提供支持
Math 提供像pi和e这样的数学常数,还支持三角函数
System 提供对操作系统的访问,包括默认的I/O流、环境变量、自动垃圾收集、系统时间和系统属性;许多System方法访问Runtime类的方法
Runtime 提供对操作系统的访问;使用java.lang.System可以更容易地访问大多数Runtime方法;唯一的例外是exec方法,它开始一个新进程Thread 和java.lang.Runnable接口协同作用提供Java中的多线程支持;
Throwable 它是Java中所有异常(Exception)的基类,是java.lang.Exception、java.lang.Error和java.lang.RuntimeException的超类。应用程序运行时发生意外时,异常和错误就发出信号;
现在再看看别的一些Java软件包:
java.applet---Java的小程序和声音编辑提供支持;
java.awt---Java固有的窗口和绘图软件包:抽象窗口工具(AWT-Abstract Window Toolkit),该工具包含像字体、颜色和形状一类的基本绘图功能,还支持一些组件,如按钮、列表框、菜单、文本框以及控制安排组件的布局管理器。AWT是可移植的
java.beans---Java Beans定义了应用程序编程接口(API);Java Beans是Java应用程序环境的中性平台组件结构;
java.io---定义了大量的本地I/O支持类;它既支持字节流I/O,也支持字符流I/O。
java.math---支持任意精度值的数学运算,包含两个类:BigDecimal和BigInteger。
java.net---支持基于URL的,也支持基于套接字的网络I/O;
java.text---为国际化的应用程序提供类,包括:日期格式、数字、货币格式及排序的顺序。
java.util---包括其他方面的类来支持数据结构、随机数、日期、时区及日历等。
WFC软件包
到现在为止,出现过的多数代码使用了Visual J++带来的窗口基类库(WFClibrary-Windows Foundation Class library),所有的WFC类在com.ms.wfc中的软件包里。
*app---包含支持应用程序的类,包括:Application(应用程序)、Message(消息)、Window(窗口)、Clipboard (剪贴板)、
DataFormat(数据格式)、 Registry(注册)、 Time(时间)、 Timer(定时器)和 Version(版本)。
*它是个很重要的的软件包,在大略浏览了主要的WFC软件包之后,将花些时间介绍这个包中的几个重要的类。
*core---WFC应用程序和视图设计器(View Designer)定义了核心类,包括Component(组件)、Container(包容器)、 Event(事件)、EventHandler(事件处理程序)、EventInfo(事件信息)、ClassInfo(类信息)和Enum(枚举)等类。该软件包还定义了在视图设计器中使用的一些基本编辑器。
*data和data.ui---提供使用ADO(ActiveX Data Objects)的数据库访问。
*html---支持超文本链接(HTML-Dynamic HTML)。
*io---支持Win32格式的文件I/O。
*ole32---对OLE的拖放提供支持。
*ui---定义WFC中的用户接口组件,读者其实已经大量地使用了该软件包中的类了:因为每次用到一个窗体(Form)时,都会用到包中的类。
*util---为数据结构定义一些实用类。