Chapter11大型程序的发展在Java里,我们可以将大型程序内的类独立出来,分门别类地存到文件里,再将这些文件一起编译执行,如此的程序代码将更具亲和性且易于维护。本章将介绍大型程序的发展、类库的概念以及Java所提供的常用的类库。11-1文件的分割在开发大型程序时,由于工作上的需要,程序代码的开发往往是有一些人,或几个小组同时进行。每个参与的小组或小组成员分别负责某些类,并肩编写好的类分别保存在各自的文件中,知道所有的类均开发好,在分别编译与执行。这种文件分割的方式,好处在于便于程序的开发与维护。在java里是如何实现文件的分割与编译呢?让我们再以CCircle类为例将编好的两个类分分开保存成两个文件,并置于同一个文件夹内(假设放在c:\java\pack1文件夹内)//CCircle.java文本置于c:\java\pack1文件夹下ClassCCircle//定义类CCircle{Publicvoidshow(){System.out.println(“show()methodcalled”);}}//app11_1.java,文本置于c;\java\pack1文件夹内Publicclassapp11-1{Publicstaticvoidmain(Stringargs[]){CCirclecir=newCCircle();Cir.show();}}将文件创建好之后,在Java的环境里分别编译这两个文件:c:\javajavacpack1\CCircle.javac:\javajavacpack1\app11_1.java编译好之后,分别产生CCircle.class与app11_1.class两个文件,如图11-1所示CCircle类CCircle类App11-1类App11-1类compliecomplie运行程序:C:\javajavapack1\app11_1运行结果:Show()methodcalled通过以上实例大家应该可以了解如何编译运行分割过的Java文件了。11-2使用packagepackage是在使用多个类或接口时,避免名称重复而采用的一种措施。怎么使用呢?在类或接口的最上面一行加上package的声明就可以了。11-2-1package的基本概念Package的声明Packagepackage名称经过package的声明之后,在同一文件内的接口或类都被纳入相同package中。加上package的声明之后,编译与运行的过程与方法有所改变。一个实际的例子:app11_2是package使用的范例。请先建文件,再置于pack2文件夹内。注意存放app11_2.java的文件夹名称必须与package名称相同。//app11_2,package的使用(-),此文件置于pack2文件夹内Packagepack2;ClassCCircle//CCircle类已置于pakcagepack2中{publicvoidshow(){System.out.println(“show()methodcalled”);}}publicclassapp11_2//将CCircle类也纳入packagepack2当中{publicstaticvoidmain(Stringargs[]){CCirclecir=newCCircle();cir.show();}}编译app11-2.java:c:\javajavac\app11_2.java让我们检查pack2文件夹就会发现产生CCircle.class,app11-2.class这样两个文件,如图11-2所示执行app_2:需要特别注意的两点:C:\javajavapack2.app11_2执行结果:Show()methodcalled1.编译时必须输入“文件夹名称\Java文件名”2.运行时必须输入”package名称.类名称“11-2-2将独立分开的类纳入同一个package中问题:当类存在不同的文件,但隶属于同一个package,那么怎样编译与运行呢?首先,现在Java的文件夹下创建一个子文件pack3,然后,在分别创建下列两个文件,并将其保存在pack3文件内;Packagepack3;//将CCircle类纳入packagepack3中ClasssCCircle{Publicvoidshow(){System.out.println(“show()methodcalled”);}}Packagepack3Publicclassapp11_3{Publicstaticvoidmain(Stringargs[]){CCirclecir=newCCircle();cir.show();}}编译app11_3:运行app11_3C:\javajavacpack3\app11_3.javaC:\java.javacpack3\CCircle.javac:\Javajavapcke3.app11_3运行结果:Show()methodcalled由本例中,读者可看到不论有几个类,分成几个文件,只要在每个文件面加上package名称,便可将它们归属于同一个package,如图11-4所示,其他程序代码的编写和先前介绍过的方法均完全相同。11-3访问在不同package里的类到目前为止,我们所介绍的类都是隶属于同一个package,因此在程序码的编写上并不需要做修改。但如果几个类分别属于不同的package时,某个类要访问到其他类的成员时,则必须做下列的修改:若某个类需要被访问时,则必须把这个类公开出来,也就是说,此类必声明成public。若要访问不同package内某个public类的成员时,在程序代码内必须明确指明“被访问package的名称.类名称”。//CCircle.java//CCircle.java此文件存放在pack4b文件夹下packagepack4b;PublicclassCCircle//将CCircle类纳入pack4中{Publicvoidshow(){System.out.println(“show()methodcalled”);}}11-3-1简单的范例编译程序://app11_4.java此文件存放在pack4a中Packagepack4a;Publicclassapp11_4{Publicstaticvoidmain(Stringargs[]){Pack4b.CCirclecir=newpack4b.CCircle();cir.show();}}c:\javajavacpack4a\app11_4.javac:\javapack4b\CCircle.java运行结果:c:\javajavapack4a.app11_4Show()methodcalled运行程序:1.把CCircle类公开出来,也就是CCircle类必须声明称public,必须以”被访问package的名称.类名“的格式来编写。2.访问位于不同package里的类时,被访问的类必须声明称public,否则,出错。在本例中我们学要注意两点:下面我们通过图例来解释这种访问关系packagepack4bCCircle类packagepack4aapp11_4类通过pack4b.CCircle的方式才能访问到CCircle类的成员将CCircle类声明成public图11-5访问位于不同package里的类11-3-2publicprivate与protected修示符的角色修示符说明没有修示符成员或构造函数只能被同一个package内的程序访问Public如果所属类声明成public,则成员或构造函数可被不同的package内所有类所访问。若所属类不是声明成public,则成员或构造函数只能被同一个package内的程序所访问Private成员或构造函数只能被位于同一个类内的程序所访问protected成员或构造函数只能被位于同一个package内的类及它的子类来访问表11-1成员与构造函数所使用的修示符表11-2类与接口所示用的修示符修示符说明没有修示符只能让同一个package里的类来访问public其他package包里的类也可以访问此类的成员在app11_4中我们是通过“被访问的package名称.类名称”的语法来访问位于不同包里的类,很显然这不是一种好的方法。那么,有没有更好的方法呢?答案是肯定的。我们可以将要被访问包的package整个导入程序代码中,如此以来问题就更为简化了。11-3-3导入package导入包格式Importpackage名称.类名称一个使用导入包的范例//CCircle.javapackage的使用(四),此文件置于pack5b文件夹内packagepack5b;publicclassCCircle{publicvoidshow(){System.out.println(“show()methodcalled”);}}//app11_5.java,package的使用(四),此文件置于package5aPackagepack5a;Importpack5b.CCircle;//加载pack5bpackage里的CCircle类Publicclassapp11_5{publicstaticvoidmain(Stringargs[]){CCirclecir=newCCircle();//不用再写package的名称cir.show();}}当package越建越多时,将package分门别类也就更加重要。某些packag依功能划分,可再细分为几个“子package”(sub-package),这种分类,packages划分为上下层次的关系,使得程序代码的编写与维护更加容易。11-4构造package的层次关系那么,在Java里要如何创建package的层次关系呢?假设app11_6类隶属于packagepack6,CCircle与CRectangle类分别属于packagesubpack1与subpack2,而希望把subpack1与subpack2设成pack6的sub-package。在这种情形下,可以先创建app11_6、subpack1与subpack2三个文件夹,其中subpack1与subpack2为app11_6的子文件夹。接着把app11_6.java存在pack6文件夹里,再分别把CCricle.java与CRectangle.java存到subpack1与subpack2文件夹内,即可完成package层次的设置。图11-7为文件夹与所存放的Java源文件的层次关系图。目前的工作资料夹目前的工作文件夹pack6资料夹app11_6.javapack6文件夹app11_6.javasubpack1资料夹CCircle.javasubpack1文件夹CCircle.javasubpack2资料夹CRectangle.javasubpack2文件夹CRectangle.java图11-7的文件夹层次关系可转化成package的层次关系图,图11-8packagepack6app11_6类packagepack6.subpack1CCircle类CRectangle类packagepack6.subpack2程序实现//CCircle.java,此文件置于pack6\subpack1文件夹下Packagepack6.subpack1;PublicclassCCircle{Publicvoidshow(){System.out.println(“show()methodofclaasCCirclecalled”);}}//CRectangle.java,此文件夹置于pack6\subpack2文件夹下packagepack6.subpack2;PublicclassCRectangle{publicvoidshow(){System.out.println(“show()methodofclassCRectangl