《第六章 接口和包.ppt》由会员分享,可在线阅读,更多相关《第六章 接口和包.ppt(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第六章第六章 接口和包接口和包华中科技大学华中科技大学IBM技术中心技术中心主要内容提要主要内容提要创建和使用包创建和使用包编写和使用接口编写和使用接口HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava接口的引入接口的引入vJavaJava语言只支持单重继承语言只支持单重继承,它的程序中的它的程序中的类的层次结构是树状结构类的层次结构是树状结构,在处理复杂问在处理复杂问题时单重继承显得力不从心。题时单重继承显得力不从心。v为了使为了使JavaJava程序的类层次结构更加合理,程序的类层次结构更加合理,更符合实际问题的需要,我
2、们把用于完成更符合实际问题的需要,我们把用于完成特定功能的若干属性组织成相对独立的属特定功能的若干属性组织成相对独立的属性集合,这种属性的集合就是接口。性集合,这种属性的集合就是接口。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava接口定义接口定义v定义:接口是一个有名称的方法定义和常定义:接口是一个有名称的方法定义和常量定义的集合量定义的集合,但没有方法的实现。但没有方法的实现。v接口定义了一个行为协议接口定义了一个行为协议,类层次结构中类层次结构中任何地方的任何类都可以实现任何地方的任何类都可以实现.v接口是由常量和抽
3、象方法组成的特殊类:接口是由常量和抽象方法组成的特殊类:接口中的属性都是用接口中的属性都是用finalfinal修饰的常量修饰的常量接口中的方法都是用接口中的方法都是用abstractabstract修饰的没有方修饰的没有方法体的抽象方法。法体的抽象方法。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava语言的接口语言的接口v接口功能的真正实现是由实现接口的各个接口功能的真正实现是由实现接口的各个类来定义接口中各个抽象方法的具体方法类来定义接口中各个抽象方法的具体方法体。体。vJavaJava语言通过接口实现了类间的多重继承
4、语言通过接口实现了类间的多重继承功能。功能。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava接口实现多重继承接口实现多重继承v单一继承指明了子类和父类的层次关系和各自单一继承指明了子类和父类的层次关系和各自 的行为。的行为。v多重继承是指一个类有多个父类,这使得类的多重继承是指一个类有多个父类,这使得类的 层次关系不清楚。层次关系不清楚。v接口则把方法的定义同类的层次区分开来,通接口则把方法的定义同类的层次区分开来,通 过接口可以在运行中动态地定位所调用的方过接口可以在运行中动态地定位所调用的方 法,同时一个类可以实现多个
5、接口,使得接口法,同时一个类可以实现多个接口,使得接口 提供了比多重继承更简单、更灵活的功能。提供了比多重继承更简单、更灵活的功能。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心接口接口 vsvs 抽象类抽象类v接口不可以实现任何方法,而抽象类可以;接口不可以实现任何方法,而抽象类可以;v类可以实现多个接口,但父类仅只有一个;类可以实现多个接口,但父类仅只有一个;v接口和继承无关接口和继承无关,不是类层次结构的一部分。不是类层次结构的一部分。无关的类可以实现相同接口。无关的类可以实现相同接口。HUST&IBM Computer Tech
6、.Center华中科技大学华中科技大学IBM技术中心技术中心定义接口定义接口HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心完整的接口定义规范完整的接口定义规范HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心接口定义接口定义v接口包括接口声明和接口体两部分:接口包括接口声明和接口体两部分:publicpublic interfaceinterface 接口名接口名 extendsextends 父接口名列表父接口名列表 publicpublicstaticstaticfinalfin
7、al 类型类型 变量名变量名=常量值;常量值;publicpublicabstractabstractnativenative 返回值类型返回值类型 方法名方法名(参数参数列表列表)throwsthrows 异常列表异常列表;public interface MyInterface int MAXSIZE=1024;public abstract myMethod(String name);HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心接口定义的说明接口定义的说明v声明接口的关键字声明接口的关键字interfaceinterface引导
8、着所定义引导着所定义的接口名字的接口名字(符合符合JavaJava标识符规定标识符规定););v声明接口也需要给出访问控制符声明接口也需要给出访问控制符;v接口具有继承性接口具有继承性,通过关键字通过关键字extendsextends声明声明该新接口是某父接口的派生接口该新接口是某父接口的派生接口;一个接口一个接口可以有多个父接口,它们之间用逗号分隔,可以有多个父接口,它们之间用逗号分隔,形成父接口列表。形成父接口列表。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心接口体的说明接口体的说明v接口体的定义有两个部分接口体的定义有两个部分:
9、对接口中属性的声明对接口中属性的声明对接口中方法的声明对接口中方法的声明;v系统默认系统默认:接口中的所有属性都是接口中的所有属性都是publicpublic,staticstatic和和final(final(公共,静态和最终公共,静态和最终););v系统默认系统默认:接口中的所有方法都是接口中的所有方法都是publicpublic和和 abstract(abstract(公共和抽象公共和抽象););v接口中方法的方法体可用接口中方法的方法体可用JavaJava语言书写语言书写,也可用也可用其它语言书写其它语言书写(加加nativenative修饰修饰)。HUST&IBM Computer
10、Tech.Center华中科技大学华中科技大学IBM技术中心技术中心实例实例v定义一个股票监视器。一旦股票价格变化,立即通知定义一个股票监视器。一旦股票价格变化,立即通知观察者观察者watcherwatcher。vWatcherWatcher是一个接口,它只有一个方法,是一个接口,它只有一个方法,valueChangedvalueChanged知道股票变化的类必须实现此方法。从而必须实现知道股票变化的类必须实现此方法。从而必须实现StockWatcherStockWatcher接口接口v不仅仅是不仅仅是StockMointerStockMointer的超类,其它类只要实现此接的超类,其它类只要
11、实现此接口,就可以享受股票价格变化通知服务口,就可以享受股票价格变化通知服务。public class StockMonitor public void watchStock(StockWatcher watcher,String tickerSymbol,double delta)HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心实现接口实现接口v具体地实现接口所规定的功能具体地实现接口所规定的功能,需要某个类为接口中需要某个类为接口中的所有抽象方法编写实在的方法体。的所有抽象方法编写实在的方法体。在类的声明(定义)中用在类的声明(定义)
12、中用implementsimplements关键字说明关键字说明该类将要实现哪些接口该类将要实现哪些接口;如果实现某个接口的类不是如果实现某个接口的类不是abstractabstract的抽象类,的抽象类,则在类的定义部分必须为所有抽象方法定义具体则在类的定义部分必须为所有抽象方法定义具体方法体,方法头部分应该与接口中的定义完全一方法体,方法头部分应该与接口中的定义完全一致致;HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心实现接口实现接口如果实现某接口的类是如果实现某接口的类是abstractabstract的抽象类的抽象类,则在类的定
13、义部分可以不具体实现接口中的则在类的定义部分可以不具体实现接口中的所有方法所有方法;一个类在实现某个接口的抽象方法时,必须一个类在实现某个接口的抽象方法时,必须使用完全相同的方法声明。使用完全相同的方法声明。接口的抽象方法访问修饰符为接口的抽象方法访问修饰符为public,public,所以所以,类在实现方法时必须使用修饰符类在实现方法时必须使用修饰符publicpublic,否否则,系统将警告则,系统将警告;因为缩小了接口中定义的因为缩小了接口中定义的方法的访问控制范围。方法的访问控制范围。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中
14、心实例实例public class StockApplet extends Applet implements StockWatcher .public void valueChanged(String tickerSymbol,double newValue)v if(tickerSymbol.equals(sunTicker)v .v else if(tickerSymbol.equals(oracleTicker)v .v else if(tickerSymbol.equals(ciscoTicker)v .HUST&IBM Computer Tech.Center华中科技大学华中科技大
15、学IBM技术中心技术中心接口功能不能简单扩大接口功能不能简单扩大v例如:要加个报股价的方法在接口里,此例如:要加个报股价的方法在接口里,此时所有实现它的类不能正常工作。时所有实现它的类不能正常工作。public interface StockWatcher v final String sunTicker=SUNW;v final String oracleTicker=ORCL;v final String ciscoTicker=CSCO;v void valueChanged(String tickerSymbol,v double newValue);v void currentVal
16、ue(String tickerSymbol,v double newValue);HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心用继承来扩大接口用继承来扩大接口v如果需要增加接口的功能,可以利用继承如果需要增加接口的功能,可以利用继承来实现:来实现:public interface StockTracker extends StockWatcher void currentValue(String tickerSymbol,double newValue);HUST&IBM Computer Tech.Center华中科技大学华中科技
17、大学IBM技术中心技术中心问题问题v实现实现java.util.Iteratorjava.util.Iterator接口的类必须实接口的类必须实现哪些方法?现哪些方法?Next,Next,hasnexthasnext and remove and removev下面的接口有什么错误?下面的接口有什么错误?public interface SomethingIsWrong public void aMethod(int aValue)System.out.println(Hi Mom);HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心问题问
18、题v如何更正上面接口的错误?如何更正上面接口的错误?v下面的接口是正确的吗?下面的接口是正确的吗?public interface Marker HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava语言的包语言的包v引入的原因:引入的原因:容易找到和使用类容易找到和使用类避免名称冲突避免名称冲突 控制访问控制访问v定义:包是一个相关的类和接口的集合定义:包是一个相关的类和接口的集合,它它可以提供访问保护和名称空间管理。可以提供访问保护和名称空间管理。HUST&IBM Computer Tech.Center华中科技大学华中科技
19、大学IBM技术中心技术中心JavaJava语言的包语言的包vJavaJava平台中的类和接口是各种包的成员,平台中的类和接口是各种包的成员,这些类和接口是按照功能绑定的;这些类和接口是按照功能绑定的;v例如:基本的类在例如:基本的类在java.langjava.lang中;中;v再例如:用于输入和输出的类在再例如:用于输入和输出的类在java.iojava.io中。中。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心JavaJava语言的包语言的包v包是一种松散的类的集合包是一种松散的类的集合,通常把需要在通常把需要在一起工作的类一起工作
20、的类(互相访问互相访问)放入一个包。放入一个包。v在在JavaJava语言程序设计中,通常需要定义语言程序设计中,通常需要定义许多类;就像利用许多类;就像利用 “文件夹文件夹”把许多文件把许多文件组织在一起,使硬盘管理的文件更清晰、组织在一起,使硬盘管理的文件更清晰、更有条理一样;更有条理一样;JavaJava利用利用“包包”把一些需把一些需要在一起操作的类组织在一起,以便程序要在一起操作的类组织在一起,以便程序员更好地管理操作这些类。员更好地管理操作这些类。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心无名包无名包v系统自动建立系统自
21、动建立“无名包无名包”,也就是默认包或缺也就是默认包或缺省包省包v在缺省情况下在缺省情况下,系统会为每一个系统会为每一个(.java)(.java)源文件源文件创建一个无名创建一个无名(no name)(no name)包包,这个源文件中定义这个源文件中定义的所有类都隶属于这个无名包的所有类都隶属于这个无名包,它们之间可以它们之间可以相互引用非相互引用非private(private(私有私有)的域或方法;的域或方法;v无名包中的类不能被其它包中的类所引用或复无名包中的类不能被其它包中的类所引用或复用。用。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM
22、技术中心技术中心无名包无名包v缺省包一般只用于临时程序或测试程序缺省包一般只用于临时程序或测试程序.v建议在实际系统开发中,为每个类指定有名的建议在实际系统开发中,为每个类指定有名的包。包。vJavaJava使用文件系统来存储包,包的名称必须和使用文件系统来存储包,包的名称必须和程序文件所在目录名完全一样(大小写敏感)。程序文件所在目录名完全一样(大小写敏感)。v如果定义了一个多级结构的包,其结构也必须如果定义了一个多级结构的包,其结构也必须和文件系统的目录结构完全一致。和文件系统的目录结构完全一致。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中
23、心技术中心有名包有名包v创建有名包的语句格式为创建有名包的语句格式为 package package ;v语句功能:该语句将创建一个具有指定语句功能:该语句将创建一个具有指定名字的包,该包将把当前名字的包,该包将把当前.java.java文件中的文件中的所有类集合到这个包内。所有类集合到这个包内。v创建有名包,应该先创建一个子文件夹创建有名包,应该先创建一个子文件夹(同包名同包名)以便存放当前以便存放当前.java.java文件和对应文件和对应的的.class.class文件。文件。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心有名包有
24、名包v例如:例如:package package cardclassescardclasses;该语句是将当前类置于包该语句是将当前类置于包cardclassesscardclassess中,需中,需要在当前文件夹下创建一个名为要在当前文件夹下创建一个名为cardclassescardclasses的子的子文件夹。文件夹。v再例如:再例如:package package cardsystem.cardclassescardsystem.cardclasses;该语句将当前类置于该语句将当前类置于cardsystem.cardclassescardsystem.cardclasses中,需要在当
25、前文件夹下创建子文件中,需要在当前文件夹下创建子文件cardsystemcardsystem并在并在 cardsystemcardsystem下再创建的子文件下再创建的子文件cardclassescardclasses,当前类存放在这个文件夹里。当前类存放在这个文件夹里。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心使用包成员使用包成员v只有公共的包成员可以从定义它们的包外只有公共的包成员可以从定义它们的包外访问,要从包外访问公共的包成员,必须访问,要从包外访问公共的包成员,必须采用以下的方法:采用以下的方法:用成员的限定名引用;用成员
26、的限定名引用;导入包成员;导入包成员;导入成员所属的整个包。导入成员所属的整个包。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心使用包成员使用包成员v使用包名作为类名前缀使用包名作为类名前缀 :java.util.Vectorjava.util.Vector vcvc=new =new java.util.Vectorjava.util.Vector()()v加载需要使用的类加载需要使用的类 import import java.util.Vectorjava.util.Vector;Vector Vector vcvc=new Vec
27、tor();=new Vector();HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心使用包成员使用包成员v加载整个包加载整个包 import import java.utiljava.util.*;.*;Vector Vector vcvc=new Vector();=new Vector();v消除名称的二义性消除名称的二义性使用成员的限定名;使用成员的限定名;使用环境变量使用环境变量 classpathclasspath set set classpathclasspath=javacjavac classpathclasspat
28、h MyClass.javaMyClass.java java java classpathclasspath MyClassMyClassHUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心使用包成员使用包成员v在使用在使用importimport语句的时候,可以使用通配符一次语句的时候,可以使用通配符一次导入一个包中的所有类,如:导入一个包中的所有类,如:import import java.utiljava.util.*;.*;v这样,我们在使用这样,我们在使用java.utiljava.util包中的任何类时,就包中的任何类时,就可以
29、直接使用简单类名。需要注意的是,可以直接使用简单类名。需要注意的是,importimport语句要么导入一个类,要么导入一个完整包。不语句要么导入一个类,要么导入一个完整包。不能使用通配符标记包的子集或多个包,下面三条能使用通配符标记包的子集或多个包,下面三条语句均无法通过编译:语句均无法通过编译:import import java.applet.Ajava.applet.A*;*;import java.*.*;import java.*.*;import java.*.import java.*.ioio;HUST&IBM Computer Tech.Center华中科技大学华中科技大学
30、IBM技术中心技术中心使用包成员使用包成员v为了简化代码,为了简化代码,JavaJava语言规定在以下情况语言规定在以下情况时无需使用时无需使用importimport语句导入包:语句导入包:使用缺省包中的类使用缺省包中的类使用使用java.langjava.lang包中的类包中的类使用和当前类在同一个包中的其他类使用和当前类在同一个包中的其他类HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心管理源代码文件管理源代码文件v将类或者接口的源代码放在一个文本文件将类或者接口的源代码放在一个文本文件中,文件名为类或者接口的简单名;中,文件名为类
31、或者接口的简单名;v将源代码文件放在一个目录中,目录名反将源代码文件放在一个目录中,目录名反映的是类或者接口所属的包的名称。映的是类或者接口所属的包的名称。v例如:例如:HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心管理源代码文件管理源代码文件v包成员的限定名称与文件的路径是对应的,包成员的限定名称与文件的路径是对应的,它们的对应关系为:它们的对应关系为:HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心管理类文件管理类文件v与源代码文件一样,字节码文件也可以通与源代码文件一样,字节
32、码文件也可以通过包来进行管理;过包来进行管理;v字节码文件不必和源代码文件位与相同的字节码文件不必和源代码文件位与相同的目录中,可以单独管理;这样做的目的可目录中,可以单独管理;这样做的目的可以隐藏源代码文件。以隐藏源代码文件。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心类路径类路径v定义:类路径是一个目录或定义:类路径是一个目录或zipzip文件的有序文件的有序列表,用于搜索类文件。列表,用于搜索类文件。v类路径中列出的每个目录都是包含包目录类路径中列出的每个目录都是包含包目录的顶层目录,编译器和解释器可以根据类的顶层目录,编译器和
33、解释器可以根据类的包名称和类名从顶层目录开始构造路径的包名称和类名从顶层目录开始构造路径的其余部分。的其余部分。v例如:上图所示的目录结构的类路径项目例如:上图所示的目录结构的类路径项目包含包含classesclasses,但是不包含,但是不包含comcom或者或者comcom以下以下的任何目录,编译器和解释器用的任何目录,编译器和解释器用.class.class文文件的完整包名构造它的路径名。件的完整包名构造它的路径名。HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心问题问题v假设你已经写了一些类,并且需要将这些假设你已经写了一些类,并
34、且需要将这些类放进三个包中,如下所示:类放进三个包中,如下所示:为了将这些类放到正确的包中,需要在每个源为了将这些类放到正确的包中,需要在每个源代码中增加什么代码?代码中增加什么代码?HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心问题问题vIn Client.java add:package mygame.client;vIn Server.java add:package mygame.server;:vIn Utilities.java add:package mygame.shared;HUST&IBM Computer Tech
35、.Center华中科技大学华中科技大学IBM技术中心技术中心问题问题为了遵守为了遵守“管理源代码文件和类文件管理源代码文件和类文件”所述的所述的目录结构,需要在开发目录下创建一些子目录,目录结构,需要在开发目录下创建一些子目录,并且将源代码文件放到正确的子目录中,必须并且将源代码文件放到正确的子目录中,必须创建哪些子目录?各个源代码文件应该放在哪创建哪些子目录?各个源代码文件应该放在哪个子目录中?个子目录中?In mygame/client/place:Client.java In mygame/server/place:Server.java In mygame/shared/place:Utilities.java HUST&IBM Computer Tech.Center华中科技大学华中科技大学IBM技术中心技术中心欢迎提问欢迎提问