java程序设计教程第5章.ppt

上传人:tia****nde 文档编号:12707034 上传时间:2020-05-14 格式:PPT 页数:96 大小:692.50KB
返回 下载 相关 举报
java程序设计教程第5章.ppt_第1页
第1页 / 共96页
java程序设计教程第5章.ppt_第2页
第2页 / 共96页
java程序设计教程第5章.ppt_第3页
第3页 / 共96页
点击查看更多>>
资源描述
,第5章接口、内部类和包,5.1接口5.2内部类5.3包5.4JavaAPI基础本章小结习题,5.1接口Java支持单重继承机制,不支持多重继承,即一个类只能有一个超类。单继承机制使得Java结构简单,层次清楚,易于管理,但在实际应用中也需要使用多重继承功能。为了实现像C+中的多继承性,Java中引入了接口概念,接口和单重继承相结合很好地实现了多重继承的功能。接口和类非常相似,接口用于定义几个类具有的但又不在这些类中定义的功能,通过在接口中设置这些方法,描述出共同的特性,然后由类本身定义如何实现。,5.1.1接口定义接口是由常量和抽象方法组成的特殊类。接口定义由关键字interface引导,分为接口的声明和接口体。其中,interface声明接口名,在接口体中定义常量和方法。在接口体中只进行方法的声明,不能进行方法的实现。具体定义语法如下:publicinterface接口名extends父接口名列表publicstaticfinal域类型域名=常量值;常量域声明publicabstractnative返回值方法名(参数列表)throw异常列表;抽象方法声明,有关接口的定义要注意以下几点:(1)interface是声明接口的关键字,可以把它看成一个特殊的类。(2)声明接口可给出访问控制符,用public修饰的是公共接口,可以被所有的类和接口使用。若接口声明为public,则接口中的方法和变量也全部为public。如果是默认修饰符的接口,则只能被同一个包中的其他类和接口使用。(3)接口名要求符合Java标识符的规定。,(4)接口也具有继承性,定义一个接口时,可以通过extends关键字声明该接口是某个已经存在的父接口的派生接口,它将继承父接口的所有属性和方法。一个接口还可以继承多个父接口,父接口间用逗号分隔。(5)系统默认接口中所有属性的修饰都是publicstaticfinal。(6)系统默认接口中所有方法的修饰都是publicabstract。,(7)在接口中对抽象方法声明时,只能给出这些抽象方法的方法名、返回值和参数列表,而不能定义方法体,即这些接口仅仅是规定了一组信息交换、传输和处理的“接口”。以下是接口定义的一个示例,声明了一个接口Student_info,表示学生情况,其中有一个数据成员year,两个成员方法age和output。定义在接口中的变量全部隐含为final和static,因此成员变量year必须设置初值。接口在语句构成上与类相似,但是其中只有方法的声明,没有方法的实现。,【示例5-1】Student_info.java。publicinterfaceStudent_infointyear=2008;intage();voidoutput();,5.1.2实现接口接口是抽象类的一种,不能直接用于创建对象。接口的作用在于规定了一些功能框架。接口的定义仅仅是实现某一特定功能的一组功能的对外接口和规范,具体功能的实现则由遵守该接口约束的类去完成,即由这些类来具体定义接口中各种抽象方法的方法体。因而在Java中,通常把对接口功能的“继承”称为“实现”。,一旦一个接口被定义,一个或多个类就可以实现该接口。用关键字implements声明一个类将实现一个接口。其声明格式如下:classextendsimplements,其中,可以是public,也可以省略。,有关接口的实现,应该注意以下问题:(1)一个类可以实现多个接口,用逗号分隔接口列表。(2)如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口的所有抽象方法,即为所有抽象方法定义方法体,而且方法头部分应该与接口中的定义完全一致,即有完全相同的返回值和参数列表。,(3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。但是对于这个抽象类的任何一个非抽象的子类而言,它们的父类所实现的接口中的所有抽象方法都必须有实在的方法体。这些方法体可以来自抽象的父类,也可以来自子类自身,但是不允许存在未被实现的接口方法。这主要体现了非抽象类中不能存在抽象方法的原则。(4)接口的抽象方法的访问限制符都已指定为public,一个类在实现一个接口时,必须实现接口中的所有方法,并且方法必须声明为public。,下面是一个类实现接口的示例,声明的类Student实现接口Student_info,其中Student类中有自己的三个成员变量name、sex和birth_year,实现接口方法age时使用了接口中的变量year值。,【示例5-2】Student.java。publicclassStudentimplementsStudent_infoStringname;Stringsex;intbirth_year;publicStudent(Stringn,Strings,inty)name=n;sex=s;birth_year=y;,publicintage()returnyear-birth_year;publicvoidoutput()System.out.println(this.name+this.sex+this.age()+岁);publicstaticvoidmain(Stringargs)Studentstu=newStudent(小红,女,1983);stu.output();,程序运行结果:小红女25岁从上例可以看出,一个类实现一个接口,必须给出接口中所有方法的实现。如果不能实现某方法,也必须写出一个空方法。此外,Java允许多个类实现同一个接口,这些类之间可以是无联系的,每个类各有自己实现方法的细节,这是与继承机制的不同之处。,【示例5-3】transport.java。interfacefeepublicvoidcharge();classbusimplementsfeepublicvoidcharge()System.out.println(“bus:全程1元”);,classcarimplementsfeepublicvoidcharge()System.out.println(“car:6元起价,1.70元/公里”);classtransportpublicstaticvoidmain(Stringargs)bus七路=newbus();car富康=newcar();七路.charge();富康.charge();,程序运行结果:bus:全程1元car:6元起价,1.70元/公里在本例中,定义了一个接口fee,包括成员方法charge,而声明的类bus和类car都实现同一个接口fee,这样就完成了多个类实现同一个接口。,Java允许多个类实现同一个接口的同时,一个类也能实现多个接口,这样就解决了多重继承的问题。多重继承是指一个子类可以有多个直接父类,该子类可以全部或部分继承所有直接父类的数据成员及成员方法。Java中不允许类的多重继承,但允许接口的多重继承。可以把接口理解成为一种特殊的类,即由常量和抽象方法组成的特殊类。一个类只能有一个父类,但是它可以同时实现若干个接口。在这种情况下,如果把接口理解成特殊的类,那么这个类利用接口实际上就获得了多个父类,即实现了多重继承,如图5-1所示。,图5-1继承机制,下例是通过Java接口实现多重继承的示例,首先声明两个接口theShape和showShape,其中包括两个成员方法getArea和showInfor。【示例5-4】Circle.java。interfacetheShapedoublePI=3.14159;doublegetArea();,interfaceshowShapevoidshowInfor();publicclassCircleimplementstheShape,showShapeintr;Circle(intr)this.r=r;,publicdoublegetArea()returnr*r*PI;publicvoidshowInfor()System.out.print(r=+r+tthearea:+getArea();,publicstaticvoidmain(Stringargs)Circlec=newCircle(10);c.showInfor();程序运行结果:r=10thearea:314.159,5.2内部类在一个类中定义另外一个类,这个类就叫做内部类或内置类(innerclass),也称嵌套类,包含内部类的类称为外部类(outerclass)。内部类与外部类存在逻辑上的所属关系,内部类的使用要依托外部类,内部类一般用来实现一些没有通用意义的逻辑功能。与一般的类相同,内部类可以具有数据成员和成员方法。通过建立内部类的对象,可以存取其数据成员和调用其成员方法。,以下是内部类定义的一个简单示例,本例中声明的Group类中包含有Student类。相对而言,Group类称为外部类,Student类称为内部类,内部类中也可以声明数据成员和成员方法。,【示例5-5】Group.java。publicclassGroupintcount;publicclassStudentStringname;publicvoidoutput()System.out.println(this.name+zz);,与类的其他成员一样,内部类也分为static和非static,前者称为静态内部类,后者称为成员类(非静态内部类)。同时,内部类也可以在某个方法中定义,这种内部类称为局部内部类。另一种匿名内部类则是创建对象的同时定义类的实现,但是未规定类名。,5.2.1成员类下面示例中,声明OuterOne外部类中包含有内部类InnerOne,其中外部类和内部类的其他成员处于同级位置,所以称为成员类。,【示例5-6】OuterOne.java。publicclassOuterOneprivateintx=3;InnerOneino=newInnerOne();/外部类有一个属性指向创建的内部类的对象publicclassInnerOne/内部类privateinty=5;publicvoidinnerMethod()System.out.println(yis+y);,publicvoidinnerMethod2()System.out.println(“x2is”+x);/访问外部类变量/内部类结束publicvoidOuterMethod()System.out.println(xis+x);ino.innerMethod();ino.innerMethod2();,publicstaticvoidmain(Stringarg)OuterOnemy=newOuterOne();my.OuterMethod();程序运行结果:xis3yis5x2is3,需要注意的是,内部类是一个编译时的概念,编译成功后就会成为完全不同的两类。一个名为OuterOne的外部类和其内部定义的名为InnerOne的内部类经过编译后出现OuterOne$InnerOne.class和OuterOne.class两类。内部类的命名除了不能与自己的外部类同名外,不必担心与其他类名的冲突,因为其真实的名字上加了外部类名作为前缀。在内部类中可以访问外部类的成员。与外部类的成员一样,在内部类中可以使用访问控制符public、protected、private修饰。,在外部类中访问内部类一般通过在外部类的成员定义中创建内部类的对象,例如InnerOneino=newInnerOne()。在内部类中使用this,this指内部类的对象,要访问外部类的当前对象须加上外部类名作前提。例如外部类OuterOne,内部类InnerOne,用OuterOne.this代表外部类的this对象。,5.2.2静态内部类和普通的类一样,内部类也可以有静态的。定义为static的内部类称为静态内部类。和非静态内部类相比,静态内部类没有了指向外部的引用。同时,非静态内部类不能声明静态成员,只有静态内部类才能声明静态成员。,静态内部类将自动转化为顶层类(top-levelclass),即它没有父类,而且不能引用外部类成员或其他内部类成员。当一个内部类不需要引用外部类成员,只需要隐藏在另一个类中时,可以将该内部类声明为静态的。以下是一个简单的例子,本例的类Test中声明的一个内部类Person是静态的、公用的,其中可以声明静态变量count。静态内部类Person中不能访问外部类成员。,【示例5-7】StaticTest.java。publicclassStaticTestpublicstaticclassPersonprivateintage;privateStringname;staticintcount=0;Person(Stringn,inta)name=n;age=a;count+;,publicvoiddisplay()System.out.println(count=+count+t+name+t+age);,publicstaticvoidmain(Stringargs)StaticTest.Personperson1=newStaticTest.Person(“Lily”,16);person1.display();StaticTest.Personperson2=newStaticTest.Person(“Jason”,25);person2.display();StaticTest.Personperson3=newStaticTest.Person(“Liming”,30);person3.display();,程序运行结果:count=1Lily16count=2Jason25count=3Liming30,5.2.3局部内部类Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。【示例5-8】Testpart.java。publicclassTestpartpublicstaticvoidmain(Stringargs)finalinti=8;classpersonpublicStringname;,publicvoidshow()System.out.println(i);System.out.println(this.name);personp=newperson();p.name=“Zhangbei”;p.show();,程序运行结果:8Zhangbei上例中,在main方法中定义了类person,它是一个内部类。内部类方法show访问了main方法中定义的final类型的局部变量。其中,方法中内部类只能访问方法中final类型的局部变量,而不能访问其他类型的局部变量,但可以访问外部类的所有数据成员和成员方法。,5.2.4匿名内部类Java语言允许创建对象的同时定义类的实现,但是未规定类名,Java将其定义为匿名内部类。Java的匿名内部类同匿名数组一样,在只需要创建一个类的对象并且用不上它的名字时,或者说有的内部类只需要创建一个它的对象,以后不会用到这个类,在这种情况下一般使用匿名内部类比较合适。匿名内部类的语法规则如下:newinterfacename();或newsuperclassname();下例中,先声明一个接口Contents。,【示例5-9】Contents.java。publicinterfaceContentsintvalue();下例中,方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象。,【示例5-10】Goods.java。publicclassGoodspublicContentscont()returnnewContents()privateinti=11;publicintvalue()returni;/在这里需要一个分号,示例5-10中,cont()方法将下面两个动作合并在一起:返回值的生成;表示这个返回值的类的定义。cont()方法创建了一个继承自Contents的匿名类的对象,通过new表达式返回的引用被自动向上转型为Contents的引用。需要注意的是,匿名内部类因为没有名字,所以它没有构造方法(但是如果这个匿名内部类继承了一个只含有带参数构造方法的父类,创建它的时候就必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果要初始化它的数据成员,可以采用下面几种方法:,(1)如果是一个方法的匿名内部类,通过这个方法传进需要的参数,同时这些参数必须被声明为final。(2)将匿名内部类改造成有名字的局部内部类,这样这个类就可以拥有构造方法。(3)在匿名内部类中使用初始化代码块。通过上面的讲述,可以看出,内部类是位于一个类中的代码,其访问权限和类中的方法一样。在内部类中可以直接引用它的外部类中的成员,而在外部类中,需要通过一个内部类的对象引用内部类中的成员。,在一种情况下需要实现一个接口,而在另一种情况下又不需要实现这个接口时,这时可以使用内部类来解决这一问题,让内部类来实现这个接口。使用内部类来实现接口,可以更好地定位与接口关联的方法在代码中的位置。Java内部类有效地解决了多重继承的问题。,5.3包为了便于管理大型软件系统中数目众多的类,解决类命名冲突的问题,Java引入了包(package)。包是Java提供的一种区别类名空间的机制,是类的组织方式,包对应一个文件夹,包中还可以再有包,称为包等级。,5.3.1包的创建包的创建就是将源程序文件中的接口和类纳入指定的包。在一般情况下,Java源程序由以下五部分组成。(1)package:一个包(package)说明语句(可选项),其作用是将源文件中的接口和类纳入指定包。源文件中若有包说明符,则必须是第一个语句。(2)import:若干个(import)语句(可选项),其作用是引入源文件中需要使用的包。(3)publicclass:一个public的类声明,在一个源文件中只能有一个public类。(4)class:若干个属于本包的类声明。(5)interface:声明接口。,创建一个包就是把包含一个package的命令作为一个Java源文件的第一句。该文件中定义的任何类型将属于指定的包。package语句定义了一个存储类的名字空间。如果省略package语句,类名将被输入一个默认的没有名称的包。下面是package声明的一般形式:package;其中,package是关键字,是标识符。通过这个语句就可以创建一个具有指定名字的包。例如:packageMyPackage;,多个文件可以包含相同的package声明。package声明仅仅指定了文件中所定义的类属于哪一个包,不排除其他文件中的其他类也属于同一个包。包中的类可以来自不同的源文件,大多数包都伸展到很多文件,即多个文件可以有同一个package语句。实际上,创建包就是在当前文件夹下创建一个子文件夹,这个包中所有类的字节码文件将存放在该文件夹下,即存放这个包中包含的所有类的.class文件。以下是创建包的一个示例。,【示例5-11】Circle_area.java。packagetest;publicclassCircle_areapublicstaticvoidmain(Stringargs)finalfloatPI=3.14f;floatr=3.6f,area;area=PI*r*r;System.out.println(“Area(”+r+“)=”+area);,程序运行结果:Area(3.6)=40.694397上例中将圆面积的计算封装在Circle_area类中。package语句指示将该类安排在test包中,实际上,就是将该类文件存放在当前路径的test子文件包下。另外,还可以创建包层次,将每个包名与它的上层包名用点“.”分隔开。一个多级包声明的通用格式如下:package包名1.包名2.包名3;例如:packageMyPackage.NewDate;,packageMyPackage.NewDate;语句中的符号“.”代表了目录分隔符,说明这个语句创建了两个文件夹:一个是当前文件夹下的子文件夹MyPackage;一个是MyPackage下的子文件夹NewDate,当前包中的所有类就存放在这个文件夹里。,5.3.2包的引入将类组织成包的目的是为了更好地利用包中的类。Java使用了import语句来引入特定的类甚至整个包。一旦被引入,类可以被直呼其名地引用。在Java源程序文件中,import语句紧接着package语句(如果package语句存在),它存在于任何类定义之前。下面是import声明的一般形式:import包名1.包名2.(classname|*);,其中,包名1是顶层包名,包名2是在外部包中的用句点“.”隔离的下级包名。同时,指定一个清楚的类名或者指定一个“*”,该“*”号表明Java编译器应该引入整个包。下面的例子显示了这两种形式:importjava.util.Date;/表示引入包java.util中Date类importjava.io.*;/表示引入包java.io中所有的类,5.3.3设置包的路径1Java包的路径要引用Java包,除在源程序中增加import语句之外,还要通过设置环境变量告诉系统程序运行时找到Java包的路径。由于Java使用文件系统来存储包和类,因此类名就是文件名,包名就是文件夹名。路径设置:“我的电脑”“属性”“高级”“环境变量”。新建系统变量“classpath”,语句是:“classpath=.;C:j2sdk1.5.0lib”,其中C:j2sdk1.5.0lib是JDK1.5系统安装的路径。,2自定义的包程序员自定义的包Mypackage,通过设置包的存放路径告诉系统包的位置。Java用文件系统目录来存储包,其中目录名称必须和包名严格匹配。例如,任何声明为MyPackage包中的一部分的类.class文件被存储在一个MyPackage目录中。,例如,在D:myjava之中创建一个与包同名的文件夹D:myjavaMypackage,并将编译过的文件(.class)放入该文件夹中。包名与文件名的大小应该一致。接着再添加环境变量classpath的路径如下:setclasspath=.;C:j2sdk1.5.0lib;D:myjava其他类通过importMypackage.*语句可以引用Mypackage包中的类。程序运行时,系统将在D:myjava中寻找Mypackage包。,例如,声明一个完整的日期类NewDate,将编译后的日期类文件NewDate.class放在已建立的包Mypackage中。其中要将声明的公用类NewDate放在Mypackage包中,有以下四个步骤:(1)创建文件夹D:myjavaMypackage。(2)设置环境变量classpath:setclasspath=.;DL:myjava。(3)在源程序NewDate.java中,声明NewDate类放在包Mypackage中:,packageMypackage;importjava.util.*;/引用java.util包publicclassNewDate/NewDate类主体,(4)将源程序NewDate.java编译后生成的NewDate.class文件拷入D:myjavaMypackage文件夹中,然后在其他类中可以用import语句引用Mypackage包中声明的类NewDate。例如,在另一程序People.java中,引用Mypackage包中的NewDate类如下:importMypackage.NewDate;引用Mypackage包中的NewDate类publicclassPeoplePeople类主体,5.3.4包的作用在利用面向对象技术开发实际的系统时,通常需要定义许多类共同工作,而有些类可能要在多处反复使用。在Java程序中,如果一个类在多个场合下反复使用,就把它存放在一个“包”的程序组织单位中。包是接口和类的集合,或者说包是接口和类的容器。使用包有利于实现不同程序间类的重用。Java语言提供了很多包,即Java类库中的包。同时,Java语言还为程序员提供了自行定义包的机制。,包的作用主要有两个:一是划分类名空间,同一个包中的类(包括接口)不能重名,不同包中的类可以重名。二是控制类之间的访问,类之间的访问控制是通过类修饰符来实现的。若类声明修饰符为public,则表明该类不仅可提供同一包中的类访问,也可以被其他包中的类访问;若类声明无修饰符,则表明该类仅供同一包中的类访问。,5.4JavaAPI基础Java提供的用于语言开发的类库,称为应用程序编程接口(API,ApplicationProgramingInterface),即软件开发商提供的用于开发软件的类与接口的集合,分别放在不同的包中。Java提供现成的类库供程序员使用,其中封装了很多函数,只显示函数名、参数等信息,不提供具体实体,显示出来的这些即称为API。同时由于Java是开源的,还可以看到类库中方法的具体实现。,API就相当于Java中的字典,遇到什么问题就可以查看API。打开Java的帮助文档,可以看到所有的包及其中的类和方法。下面是官方下载网址,也可以在线查看:,5.4.1Java提供的包概述Java提供的常用包如表5-1所示。,5.4.2java.lang语言包java.lang包是Java语言的核心包,包含了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异构处理类等。每个Java程序运行时,系统都会自动引入java.lang包,所以这个包的加载是缺省的。java.lang包中主要包括的常用类如表5-2所示。,java.lang中也定义了如下接口:(1)Appendable(可追加接口),能够添加char序列和值的对象。(2)CharSequence(可阅读字符序列接口),此接口对许多不同种类的char序列提供统一的只读访问。(3)Cloneable(可克隆接口),实现了Cloneable接口的类,以指示Object.clone()方法可以合法地对该类实例进行按字段复制。(4)Comparable(可比较接口),此接口强行对实现它的每个类的对象进行整体排序。,(5)Iterable(可迭代接口),实现了该接口的类一般作为容器,且具有提供依次访问被包容对象功能的能力。(6)Readable(可读取接口),对象可以从实现了该接口的类的实例对象中读取字符。(7)Runnable(可运行接口),接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run的无参数方法。(8)Thread.UncaughtExceptionHandler(线程未捕获异常控制器接口),当Thread因未捕获的异常而突然终止时,调用处理程序的接口。,下面通过一个实例,说明使用Integer类的静态方法将十进制字符串转换为二进制、八进制、十六进制字符串输出,使用Class、Runtime类中的方法获得运行时信息,如当前名、父类名、包名情况。其中Integer类提供了多个方法,能在int类型和string类型之间互相转换,还提供了处理int类型时非常有用的其他一些常量和方法。,【示例5-12】Runtimeinfo.java。publicclassRuntimeinfopublicstaticvoidmain(Stringargs)inti=111;Stringstr=newString(i+“”);System.out.println(i+“二进制=”+Integer.toBinaryString(i)+“八进制=”+Integer.toOctalString(i)+十六进制=+Integer.toHexString(i);,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.version”);,程序运行结果:111二进制=1101111八进制=157十六进制=6f本类名=java.lang.String超类名=java.lang.Object包名=java.lang操作系统=WindowsXPJava版本=1.5.0-b64,5.4.3java.util实用包java.util包中包括了Java语言中的一些低级实用工具,如处理时间的Date类、处理变长数组的Vector类、实现栈的Stack类和实现哈希表的HashTable类等。使用这些内置类程序员可以很方便、快捷地编程。以下简要介绍java.util包中的一些重要的类,如表5-3所示。,1日期类日期类包括Date、Calendar、GregorianCalendar类,它们描述日期和时间,提供对日期值的许多构造方法,如获得当前日期、比较两个日期、判断两个日期的先后等。类Date表示特定的瞬间,精确到毫秒。Date类有两种构造方法,一种是Date()获取系统当前日期和时间值,包括年、月、日、时、分、秒、毫秒;另一种是Date(longdate)以date创建日期对象,date表示从GMT(格林威治)时间2008-7-300:00:00开始至某时刻的毫秒数。,Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间1970年1月1日的00:00:00.000,格里高利历)的偏移量。该类还为实现包范围外的具体日历系统提供了其他字段和方法。这些字段和方法被定义为protected。与其他语言环境类一样,Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象。Calendar的getInstance方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化,获得此类型的一个通用的对象后,可以使用get()方法和常量获得日期和时间的一部分。,例如:Calendarnow=Calender.getInstance();intyear=now.get(Calendar.YEAR);在JDK1.1之前,类Date有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的API不易于实现国际化。从JDK1.1开始,应该使用Calendar类实现日期和时间字段之间的转换,使用DateFormat类来格式化和解析日期字符串。Date中的相应方法已废弃。,GregorianCalendar类是由Calendar类派生的。由于所使用的规则不同,不同的日历系统对同一个日期的解释有所不同,而GregorianCalendar实现了世界上普遍使用的公历系统。当然也可以通过继承Calendar类,并增加所需规则,以实现不同的日历系统。,2Collection接口在JavaAPI中为了支持各种对象的存储访问,提供了Collection(收集)系列API。Vector是这种类型中的一种,接口Collection处于该结构类型的最高层,其中定义了所有低层接口或类的公共方法,以下列出其中部分方法。(1)Booleanadd(Objecto):将一个对象加入收集中;(2)Booleancontains(Objecto):判断收集中是否包含指定对象;(3)Booleanremove(Objecto):从收集中删除某对象;,(4)BooleanisEmpty():判断收集是否为空;(5)Iteratoriterator():取得遍历访问收集的迭代子对象;(6)Intsize():获取收集的大小;(7)ObjecttoArrary():将收集元素转化为对象数组;(8)Voidclear():删除收集中的所有元素。,以下是iterator()方法的典型用法:Iteratorit=collection.iterator();/获得一个迭代子对象while(it.hasNext()Objectbj=it.next();/得到下一个元素,目前,JDK中并没有提供一个类直接实现Collection接口,而是实现它的两个子接口,一个是Set,另一个是List。当然,子接口继承了父接口的方法。其中,List是有序的Collection,使用此接口能够精确地控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和Set不同,List允许有相同的元素。Set是一种不包含重复元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。图5-2示出了CollectionAPI层次结构。,图5-2CollectionAPI层次结构,本章小结Java语言中不支持多重继承,而是通过接口实现比多重继承更强的功能。Java通过接口使处于不同层次、甚至互不相关的类可以具有相同的行为;通过使用关键字interface声明接口,允许程序员充分抽象它实现的接口,其中接口自己不定义任何实现。内部类是指类定义代码被置于其他类定义中的类。内部类可以将逻辑上相关的一组类组织起来,并由外部类来控制内部类的可见性。通常,内部类在类中使用,要从外部访问内部类的成员必须加上外部类的标示作为前缀。,接口是类的方法,而包则是类的容器。包是类的一种组织形式,一个类如果要在多个场合反复调用,可以把它存放在包中,包实际上就是一组类组成的集合,一般把具有共性的类放在同一个包中,即通常所说的类库。Java语言提供了很多包,即Java类库中的包。同时,Java语言还为程序员提供了自行定义包的机制。包的层次与操作系统中的目录路径相似,创建自定义包时,要将文件放到该包对应的子目录下。,JavaAPI(ApplicationProgramingInterface)是JDK提供的基础类库,即应用程序编程接口,是Java的参考手册,说明各种类、接口的定义,分别放在不同的包中。JavaAPI文档中可以看到所有的包及其中的类和方法,不同的JDK有不同的API,可以从Sun的网站上下载。,习题1.什么是接口?如何实现接口?2.什么是包?包的作用是什么?3.试创建一个自己的类,并将其加入到自定义的包里。4.编写一个程序,实现多重继承机制。5.编写一个程序,实现包的功能。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!