《java程序设计教程第5章.ppt》由会员分享,可在线阅读,更多相关《java程序设计教程第5章.ppt(96页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 1第5章 接口、内部类和包第5章 接口、内部类和包5.1 接口5.2 内部类5.3 包5.4 Java API基础本章小结习题2 2第5章 接口、内部类和包5.1 接 口Java支持单重继承机制,不支持多重继承,即一个类只能有一个超类。单继承机制使得Java结构简单,层次清楚,易于管理,但在实际应用中也需要使用多重继承功能。为了实现像C+中的多继承性,Java中引入了接口概念,接口和单重继承相结合很好地实现了多重继承的功能。接口和类非常相似,接口用于定义几个类具有的但又不在这些类中定义的功能,通过在接口中设置这些方法,描述出共同的特性,然后由类本身定义如何实现。3 3第5章 接口、内部类和
2、包5.1.1 接口定义接口是由常量和抽象方法组成的特殊类。接口定义由关键字interface引导,分为接口的声明和接口体。其中,interface声明接口名,在接口体中定义常量和方法。在接口体中只进行方法的声明,不能进行方法的实现。具体定义语法如下:publicinterface接口名extends父接口名列表publicstaticfinal域类型 域名=常量值;常量域声明publicabstractnative返回值 方法名(参数列表)throw异常列表;抽象方法声明4 4第5章 接口、内部类和包有关接口的定义要注意以下几点:(1)interface是声明接口的关键字,可以把它看成一个特殊
3、的类。(2)声明接口可给出访问控制符,用public修饰的是公共接口,可以被所有的类和接口使用。若接口声明为public,则接口中的方法和变量也全部为public。如果是默认修饰符的接口,则只能被同一个包中的其他类和接口使用。(3)接口名要求符合Java标识符的规定。5 5第5章 接口、内部类和包(4)接口也具有继承性,定义一个接口时,可以通过extends关键字声明该接口是某个已经存在的父接口的派生接口,它将继承父接口的所有属性和方法。一个接口还可以继承多个父接口,父接口间用逗号分隔。(5)系统默认接口中所有属性的修饰都是public static final。(6)系统默认接口中所有方法的
4、修饰都是public abstract。6 6第5章 接口、内部类和包(7)在接口中对抽象方法声明时,只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即这些接口仅仅是规定了一组信息交换、传输和处理的“接口”。以下是接口定义的一个示例,声明了一个接口Student_info,表示学生情况,其中有一个数据成员year,两个成员方法age和output。定义在接口中的变量全部隐含为final和static,因此成员变量year必须设置初值。接口在语句构成上与类相似,但是其中只有方法的声明,没有方法的实现。7 7第5章 接口、内部类和包【示例5-1】Student_info.java
5、。public interface Student_info int year=2008;int age();void output();8 8第5章 接口、内部类和包5.1.2 实现接口接口是抽象类的一种,不能直接用于创建对象。接口的作用在于规定了一些功能框架。接口的定义仅仅是实现某一特定功能的一组功能的对外接口和规范,具体功能的实现则由遵守该接口约束的类去完成,即由这些类来具体定义接口中各种抽象方法的方法体。因而在Java中,通常把对接口功能的“继承”称为“实现”。9 9第5章 接口、内部类和包一旦一个接口被定义,一个或多个类就可以实现该接口。用关键字implements声明一个类将实现一
6、个接口。其声明格式如下:class extendsimplements,其中,可以是public,也可以省略。1010第5章 接口、内部类和包有关接口的实现,应该注意以下问题:(1)一个类可以实现多个接口,用逗号分隔接口列表。(2)如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。1111第5章 接口、内部类和包(3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类的任何一个非抽象的子类而言,它们的父
7、类所实现的接口中的所有抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。(4)接口的抽象方法的访问限制符都已指定为public,一个类在实现一个接口时,必须实现接口中的所有方法,并且方法必须声明为public。1212第5章 接口、内部类和包下面是一个类实现接口的示例,声明的类Student实现接口Student_info,其中Student类中有自己的三个成员变量name、sex和birth_year,实现接口方法age时使用了接口中的变量year值。1313第5章 接口、内部类和包
8、【示例5-2】Student.java。public class Student implements Student_info String name;String sex;int birth_year;public Student(String n,String s,int y)name=n;sex=s;birth_year=y;1414第5章 接口、内部类和包public int age()return year-birth_year;public void output()System.out.println(this.name+this.sex+this.age()+岁);publi
9、c static void main(String args)Student stu=new Student(小红,女,1983);stu.output();1515第5章 接口、内部类和包程序运行结果:小红 女 25岁从上例可以看出,一个类实现一个接口,必须给出接口中所有方法的实现。如果不能实现某方法,也必须写出一个空方法。此外,Java允许多个类实现同一个接口,这些类之间可以是无联系的,每个类各有自己实现方法的细节,这是与继承机制的不同之处。1616第5章 接口、内部类和包【示例5-3】transport.java。interface fee public void charge();cl
10、ass bus implements fee public void charge()System.out.println(“bus:全程1元”);1717第5章 接口、内部类和包class car implements fee public void charge()System.out.println(“car:6元起价,1.70元/公里”);class transport public static void main(String args)bus 七路=new bus();car 富康=new car();七路.charge();富康.charge();1818第5章 接口、内部类和
11、包程序运行结果:bus:全程1元car:6元起价,1.70元/公里在本例中,定义了一个接口fee,包括成员方法charge,而声明的类bus和类car都实现同一个接口fee,这样就完成了多个类实现同一个接口。1919第5章 接口、内部类和包Java允许多个类实现同一个接口的同时,一个类也能实现多个接口,这样就解决了多重继承的问题。多重继承是指一个子类可以有多个直接父类,该子类可以全部或部分继承所有直接父类的数据成员及成员方法。Java中不允许类的多重继承,但允许接口的多重继承。可以把接口理解成为一种特殊的类,即由常量和抽象方法组成的特殊类。一个类只能有一个父类,但是它可以同时实现若干个接口。在
12、这种情况下,如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承,如图5-1所示。2020第5章 接口、内部类和包图5-1 继承机制2121第5章 接口、内部类和包下例是通过Java接口实现多重继承的示例,首先声明两个接口theShape和showShape,其中包括两个成员方法getArea和showInfor。【示例5-4】Circle.java。interface theShape double PI=3.14159;double getArea();2222第5章 接口、内部类和包interface showShape void showInfor();
13、public class Circle implements theShape,showShape int r;Circle(int r)this.r=r;2323第5章 接口、内部类和包public double getArea()return r*r*PI;public void showInfor()System.out.print(r=+r+t the area:+getArea();2424第5章 接口、内部类和包public static void main(String args)Circle c=new Circle(10);c.showInfor();程序运行结果:r=10
14、the area:314.1592525第5章 接口、内部类和包5.2 内 部 类在一个类中定义另外一个类,这个类就叫做内部类或内置类(inner class),也称嵌套类,包含内部类的类称为外部类(outer class)。内部类与外部类存在逻辑上的所属关系,内部类的使用要依托外部类,内部类一般用来实现一些没有通用意义的逻辑功能。与一般的类相同,内部类可以具有数据成员和成员方法。通过建立内部类的对象,可以存取其数据成员和调用其成员方法。2626第5章 接口、内部类和包以下是内部类定义的一个简单示例,本例中声明的Group类中包含有Student类。相对而言,Group类称为外部类,Stude
15、nt类称为内部类,内部类中也可以声明数据成员和成员方法。2727第5章 接口、内部类和包【示例5-5】Group.java。public class Group int count;public class Student String name;public void output()System.out.println(this.name+zz);2828第5章 接口、内部类和包与类的其他成员一样,内部类也分为static和非static,前者称为静态内部类,后者称为成员类(非静态内部类)。同时,内部类也可以在某个方法中定义,这种内部类称为局部内部类。另一种匿名内部类则是创建对象的同时定义
16、类的实现,但是未规定类名。2929第5章 接口、内部类和包5.2.1 成员类下面示例中,声明OuterOne外部类中包含有内部类InnerOne,其中外部类和内部类的其他成员处于同级位置,所以称为成员类。3030第5章 接口、内部类和包【示例5-6】OuterOne.java。public class OuterOne private int x=3;InnerOne ino=new InnerOne();/外部类有一个属性指向创建的内部类的对象public class InnerOne /内部类private int y=5;public void innerMethod()System.o
17、ut.println(y is +y);3131第5章 接口、内部类和包public void innerMethod2()System.out.println(“x2 is”+x);/访问外部类变量/内部类结束public void OuterMethod()System.out.println(x is +x);ino.innerMethod();ino.innerMethod2();3232第5章 接口、内部类和包public static void main(String arg)OuterOne my=new OuterOne();my.OuterMethod();程序运行结果:x
18、is 3y is 5x2 is 33333第5章 接口、内部类和包需要注意的是,内部类是一个编译时的概念,编译成功后就会成为完全不同的两类。一个名为OuterOne的外部类和其内部定义的名为InnerOne的内部类经过编译后出现OuterOne$InnerOne.class和OuterOne.class 两类。内部类的命名除了不能与自己的外部类同名外,不必担心与其他类名的冲突,因为其真实的名字上加了外部类名作为前缀。在内部类中可以访问外部类的成员。与外部类的成员一样,在内部类中可以使用访问控制符public、protected、private修饰。3434第5章 接口、内部类和包在外部类中访问
19、内部类一般通过在外部类的成员定义中创建内部类的对象,例如InnerOne ino=new InnerOne()。在内部类中使用this,this指内部类的对象,要访问外部类的当前对象须加上外部类名作前提。例如外部类OuterOne,内部类InnerOne,用OuterOne.this代表外部类的this对象。3535第5章 接口、内部类和包5.2.2 静态内部类和普通的类一样,内部类也可以有静态的。定义为static的内部类称为静态内部类。和非静态内部类相比,静态内部类没有了指向外部的引用。同时,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员。3636第5章 接口、内部类和包静态
20、内部类将自动转化为顶层类(top-levelclass),即它没有父类,而且不能引用外部类成员或其他内部类成员。当一个内部类不需要引用外部类成员,只需要隐藏在另一个类中时,可以将该内部类声明为静态的。以下是一个简单的例子,本例的类Test中声明的一个内部类Person是静态的、公用的,其中可以声明静态变量count。静态内部类Person中不能访问外部类成员。3737第5章 接口、内部类和包【示例5-7】StaticTest.java。public class StaticTest public static class Person private int age;private Strin
21、g name;static int count=0;Person(String n,int a)name=n;age=a;count+;3838第5章 接口、内部类和包public void display()System.out.println(count=+count+t+name+t+age);3939第5章 接口、内部类和包public static void main(String args)StaticTest.Person person1=new StaticTest.Person(“Lily”,16);person1.display();StaticTest.Person pe
22、rson2=new StaticTest.Person(“Jason”,25);person2.display();StaticTest.Person person3=new StaticTest.Person(“Liming”,30);person3.display();4040第5章 接口、内部类和包程序运行结果:count=1Lily16count=2Jason25count=3Liming304141第5章 接口、内部类和包5.2.3 局部内部类Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。【示例5-8】Testpart.java。public class Te
23、stpart public static void main(String args)final int i=8;class person public String name;4242第5章 接口、内部类和包public void show()System.out.println(i);System.out.println(this.name);person p=new person();p.name=“Zhangbei”;p.show();4343第5章 接口、内部类和包程序运行结果:8Zhangbei上例中,在main方法中定义了类person,它是一个内部类。内部类方法show访问了m
24、ain方法中定义的final类型的局部变量。其中,方法中内部类只能访问方法中final类型的局部变量,而不能访问其他类型的局部变量,但可以访问外部类的所有数据成员和成员方法。4444第5章 接口、内部类和包5.2.4 匿名内部类Java语言允许创建对象的同时定义类的实现,但是未规定类名,Java将其定义为匿名内部类。Java的匿名内部类同匿名数组一样,在只需要创建一个类的对象并且用不上它的名字时,或者说有的内部类只需要创建一个它的对象,以后不会用到这个类,在这种情况下一般使用匿名内部类比较合适。匿名内部类的语法规则如下:new interfacename();或new superclassna
25、me();下例中,先声明一个接口Contents。4545第5章 接口、内部类和包【示例5-9】Contents.java。public interface Contents int value();下例中,方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象。4646第5章 接口、内部类和包【示例5-10】Goods.java。public class Goods public Contents cont()return new Contents()private int i=11;public int value()return i;/在这里需要一个分号4747
26、第5章 接口、内部类和包示例5-10中,cont()方法将下面两个动作合并在一起:返回值的生成;表示这个返回值的类的定义。cont()方法创建了一个继承自Contents的匿名类的对象,通过new表达式返回的引用被自动向上转型为Contents的引用。需要注意的是,匿名内部类因为没有名字,所以它没有构造方法(但是如果这个匿名内部类继承了一个只含有带参数构造方法的父类,创建它的时候就必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果要初始化它的数据成员,可以采用下面几种方法:4848第5章 接口、内部类和包(1)如果是一个方法的匿名内部类,通过这个方法传进需要的参数,同
27、时这些参数必须被声明为final。(2)将匿名内部类改造成有名字的局部内部类,这样这个类就可以拥有构造方法。(3)在匿名内部类中使用初始化代码块。通过上面的讲述,可以看出,内部类是位于一个类中的代码,其访问权限和类中的方法一样。在内部类中可以直接引用它的外部类中的成员,而在外部类中,需要通过一个内部类的对象引用内部类中的成员。4949第5章 接口、内部类和包在一种情况下需要实现一个接口,而在另一种情况下又不需要实现这个接口时,这时可以使用内部类来解决这一问题,让内部类来实现这个接口。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。Java内部类有效地解决了多重继承的问题。5
28、050第5章 接口、内部类和包5.3 包为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。包是Java提供的一种区别类名空间的机制,是类的组织方式,包对应一个文件夹,包中还可以再有包,称为包等级。5151第5章 接口、内部类和包5.3.1 包的创建包的创建就是将源程序文件中的接口和类纳入指定的包。在一般情况下,Java源程序由以下五部分组成。(1)package:一个包(package)说明语句(可选项),其作用是将源文件中的接口和类纳入指定包。源文件中若有包说明符,则必须是第一个语句。(2)import:若干个(import)语句(可选项),其
29、作用是引入源文件中需要使用的包。(3)public class:一个public的类声明,在一个源文件中只能有一个public类。(4)class:若干个属于本包的类声明。(5)interface:声明接口。5252第5章 接口、内部类和包创建一个包就是把包含一个package的命令作为一个Java源文件的第一句。该文件中定义的任何类型将属于指定的包。package语句定义了一个存储类的名字空间。如果省略package语句,类名将被输入一个默认的没有名称的包。下面是package声明的一般形式:package ;其中,package是关键字,是标识符。通过这个语句就可以创建一个具有指定名字的包
30、。例如:package MyPackage;5353第5章 接口、内部类和包多个文件可以包含相同的package声明。package声明仅仅指定了文件中所定义的类属于哪一个包,不排除其他文件中的其他类也属于同一个包。包中的类可以来自不同的源文件,大多数包都伸展到很多文件,即多个文件可以有同一个package语句。实际上,创建包就是在当前文件夹下创建一个子文件夹,这个包中所有类的字节码文件将存放在该文件夹下,即存放这个包中包含的所有类的.class文件。以下是创建包的一个示例。5454第5章 接口、内部类和包【示例5-11】Circle_area.java。package test;public
31、 class Circle_area public static void main(String args)final float PI=3.14f;float r=3.6f,area;area=PI*r*r;System.out.println(“Area(”+r+“)=”+area);5555第5章 接口、内部类和包程序运行结果:Area(3.6)=40.694397上例中将圆面积的计算封装在Circle_area类中。package语句指示将该类安排在test包中,实际上,就是将该类文件存放在当前路径的test子文件包下。另外,还可以创建包层次,将每个包名与它的上层包名用点“.”分隔开
32、。一个多级包声明的通用格式如下:package 包名1.包名2.包名3;例如:package MyPackage.NewDate;5656第5章 接口、内部类和包package MyPackage.NewDate;语句中的符号“.”代表了目录分隔符,说明这个语句创建了两个文件夹:一个是当前文件夹下的子文件夹MyPackage;一个是MyPackage下的子文件夹NewDate,当前包中的所有类就存放在这个文件夹里。5757第5章 接口、内部类和包5.3.2 包的引入将类组织成包的目的是为了更好地利用包中的类。Java使用了import语句来引入特定的类甚至整个包。一旦被引入,类可以被直呼其名地
33、引用。在Java源程序文件中,import语句紧接着package语句(如果package语句存在),它存在于任何类定义之前。下面是import声明的一般形式:import 包名1.包名2.(classname|*);5858第5章 接口、内部类和包其中,包名1是顶层包名,包名2是在外部包中的用句点“.”隔离的下级包名。同时,指定一个清楚的类名或者指定一个“*”,该“*”号表明Java编译器应该引入整个包。下面的例子显示了这两种形式:import java.util.Date;/表示引入包java.util中Date类import java.io.*;/表示引入包java.io中所有的类595
34、9第5章 接口、内部类和包5.3.3 设置包的路径1Java包的路径要引用Java包,除在源程序中增加import语句之外,还要通过设置环境变量告诉系统程序运行时找到Java包的路径。由于Java使用文件系统来存储包和类,因此类名就是文件名,包名就是文件夹名。路径设置:“我的电脑”“属性”“高级”“环境变量”。新建系统变量“classpath”,语句是:“classpath=.;C:j2sdk1.5.0lib”,其中C:j2sdk1.5.0lib是JDK 1.5系统安装的路径。6060第5章 接口、内部类和包2自定义的包程序员自定义的包Mypackage,通过设置包的存放路径告诉系统包的位置。
35、Java用文件系统目录来存储包,其中目录名称必须和包名严格匹配。例如,任何声明为MyPackage包中的一部分的类.class文件被存储在一个MyPackage目录中。6161第5章 接口、内部类和包例如,在D:myjava之中创建一个与包同名的文件夹D:myjavaMypackage,并将编译过的文件(.class)放入该文件夹中。包名与文件名的大小应该一致。接着再添加环境变量classpath的路径如下:set classpath=.;C:j2sdk1.5.0lib;D:myjava其他类通过import Mypackage.*语句可以引用Mypackage包中的类。程序运行时,系统将在D
36、:myjava中寻找Mypackage包。6262第5章 接口、内部类和包例如,声明一个完整的日期类NewDate,将编译后的日期类文件NewDate.class放在已建立的包Mypackage中。其中要将声明的公用类NewDate放在Mypackage包中,有以下四个步骤:(1)创建文件夹D:myjavaMypackage。(2)设置环境变量classpath:set classpath=.;DL:myjava。(3)在源程序NewDate.java中,声明NewDate类放在包Mypackage中:6363第5章 接口、内部类和包package Mypackage;import java.
37、util.*;/引用java.util包public class NewDate /NewDate类主体6464第5章 接口、内部类和包(4)将源程序NewDate.java编译后生成的NewDate.class文件拷入D:myjavaMypackage文件夹中,然后在其他类中可以用import语句引用Mypackage包中声明的类NewDate。例如,在另一程序People.java中,引用Mypackage包中的NewDate类如下:import Mypackage.NewDate;引用Mypackage包中的NewDate类public class People People类主体656
38、5第5章 接口、内部类和包5.3.4 包的作用在利用面向对象技术开发实际的系统时,通常需要定义许多类共同工作,而有些类可能要在多处反复使用。在Java程序中,如果一个类在多个场合下反复使用,就把它存放在一个“包”的程序组织单位中。包是接口和类的集合,或者说包是接口和类的容器。使用包有利于实现不同程序间类的重用。Java语言提供了很多包,即Java类库中的包。同时,Java语言还为程序员提供了自行定义包的机制。6666第5章 接口、内部类和包包的作用主要有两个:一是划分类名空间,同一个包中的类(包括接口)不能重名,不同包中的类可以重名。二是控制类之间的访问,类之间的访问控制是通过类修饰符来实现的
39、。若类声明修饰符为public,则表明该类不仅可提供同一包中的类访问,也可以被其他包中的类访问;若类声明无修饰符,则表明该类仅供同一包中的类访问。6767第5章 接口、内部类和包5.4 Java API基础Java提供的用于语言开发的类库,称为应用程序编程接口(API,Application Programing Interface),即软件开发商提供的用于开发软件的类与接口的集合,分别放在不同的包中。Java提供现成的类库供程序员使用,其中封装了很多函数,只显示函数名、参数等信息,不提供具体实体,显示出来的这些即称为API。同时由于Java是开源的,还可以看到类库中方法的具体实现。6868第
40、5章 接口、内部类和包6969第5章 接口、内部类和包5.4.1 Java提供的包概述Java提供的常用包如表5-1所示。7070第5章 接口、内部类和包7171第5章 接口、内部类和包5.4.2 java.lang语言包java.lang包是Java语言的核心包,包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异构处理类等。每个Java程序运行时,系统都会自动引入java.lang包,所以这个包的加载是缺省的。java.lang包中主要包括的常用类如表5-2所示。7272第5章 接口、内部类和包7373第5章 接口、内部类和包7474第5章 接口、内部
41、类和包7575第5章 接口、内部类和包java.lang中也定义了如下接口:(1)Appendable(可追加接口),能够添加char序列和值的对象。(2)CharSequence(可阅读字符序列接口),此接口对许多不同种类的char序列提供统一的只读访问。(3)Cloneable(可克隆接口),实现了Cloneable接口的类,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。(4)Comparable(可比较接口),此接口强行对实现它的每个类的对象进行整体排序。7676第5章 接口、内部类和包(5)Iterable(可迭代接口),实现了该接口的类一般作为容器,且具有
42、提供依次访问被包容对象功能的能力。(6)Readable(可读取接口),对象可以从实现了该接口的类的实例对象中读取字符。(7)Runnable(可运行接口),接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run的无参数方法。(8)Thread.UncaughtExceptionHandler(线程未捕获异常控制器接口),当Thread因未捕获的异常而突然终止时,调用处理程序的接口。7777第5章 接口、内部类和包下面通过一个实例,说明使用Integer类的静态方法将十进制字符串转换为二进制、八进制、十六进制字符串输出,使用Class、Runtime类中的方法获得运行时信
43、息,如当前名、父类名、包名情况。其中Integer类提供了多个方法,能在int类型和string类型之间互相转换,还提供了处理int类型时非常有用的其他一些常量和方法。7878第5章 接口、内部类和包【示例5-12】Runtimeinfo.java。public class Runtimeinfo public static void main(String args)int i=111;String str=new String(i+“”);System.out.println(i+“二进制=”+Integer.toBinaryString(i)+“八进制=”+Integer.toOctal
44、String(i)+十六进制=+Integer.toHexString(i);7979第5章 接口、内部类和包System.out.println(“本类名=”+str.getClass().getName()+“超类名=”+str.getClass().getSuperclass().getName()+“包名=”+str.getClass().getPackage().getName();System.out.println(“操作系统=”+System.getProperty(“os.name”)+“n”+“Java版本=”+System.getProperty(“java.vm.ver
45、sion”);8080第5章 接口、内部类和包8181第5章 接口、内部类和包5.4.3 java.util实用包java.util包中包括了Java语言中的一些低级实用工具,如处理时间的Date类、处理变长数组的Vector类、实现栈的Stack类和实现哈希表的HashTable类等。使用这些内置类程序员可以很方便、快捷地编程。以下简要介绍java.util包中的一些重要的类,如表5-3所示。8282第5章 接口、内部类和包8383第5章 接口、内部类和包8484第5章 接口、内部类和包1日期类日期类包括Date、Calendar、GregorianCalendar类,它们描述日期和时间,提
46、供对日期值的许多构造方法,如获得当前日期、比较两个日期、判断两个日期的先后等。类Date表示特定的瞬间,精确到毫秒。Date类有两种构造方法,一种是Date()获取系统当前日期和时间值,包括年、月、日、时、分、秒、毫秒;另一种是Date(long date)以date创建日期对象,date表示从GMT(格林威治)时间2008-7-3 00:00:00开始至某时刻的毫秒数。8585第5章 接口、内部类和包Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一
47、些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间1970年1月1日的00:00:00.000,格里高利历)的偏移量。该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为protected。与其他语言环境类一样,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象。Calendar的getInstance 方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化,获得此类型的一个通用的对象后,可以使用get()方法和常量获得日期和时间的一部分。8686第5章 接口、内部类和包例如:Calendar now=Cale
48、nder.getInstance();int year=now.get(Calendar.YEAR);在JDK1.1之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的API不易于实现国际化。从JDK1.1开始,应该使用Calendar类实现日期和时间字段之间的转换,使用DateFormat类来格式化和解析日期字符串。Date中的相应方法已废弃。8787第5章 接口、内部类和包GregorianCalendar类是由Calendar类派生的。由于所使用的规则不同,不同的日历系统对同一个日期的解释有所不同,而Gre
49、gorianCalendar实现了世界上普遍使用的公历系统。当然也可以通过继承Calendar类,并增加所需规则,以实现不同的日历系统。8888第5章 接口、内部类和包2Collection接口在Java API中为了支持各种对象的存储访问,提供了Collection(收集)系列API。Vector是这种类型中的一种,接口Collection处于该结构类型的最高层,其中定义了所有低层接口或类的公共方法,以下列出其中部分方法。(1)Boolean add(Object o):将一个对象加入收集中;(2)Boolean contains(Object o):判断收集中是否包含指定对象;(3)Boo
50、lean remove(Object o):从收集中删除某对象;8989第5章 接口、内部类和包(4)Boolean isEmpty():判断收集是否为空;(5)Iterator iterator():取得遍历访问收集的迭代子对象;(6)Int size():获取收集的大小;(7)Object toArrary():将收集元素转化为对象数组;(8)Void clear():删除收集中的所有元素。9090第5章 接口、内部类和包以下是iterator()方法的典型用法:Iterator it=collection.iterator();/获得一个迭代子对象while(it.hasNext()Ob