《Java语言程序设计实验指导》电子教案第06章.ppt_第1页
《Java语言程序设计实验指导》电子教案第06章.ppt_第2页
《Java语言程序设计实验指导》电子教案第06章.ppt_第3页
《Java语言程序设计实验指导》电子教案第06章.ppt_第4页
《Java语言程序设计实验指导》电子教案第06章.ppt_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章 包和接口 包和接口是Java语言最具革新性的两个 特点所在。包是Java类的容器,而接口则是 类的方法。本章将对这两个方面的内容作具 体介绍。 6.1 Java中的包 6.2 接口 Return 6.1 Java中的包 包(package)是类的容器,用来保存划分 的类名空间。包以分层方式保存并被明确地引入 新的类定义。本节将对Java中包的相关问题进行 讨论。 6.1.1 包的创建 6.1.2 关于类路径 6.1.3 一个简单的例子 6.1.4 访问保护 6.1.5 包的导入 Return 6.1.1 包的创建 Java提供了把类名空间划分为更多易管理的块的机制,这种机制就是包。包 既是命名机制也是可见度控制机制。我们可以在包内定义类,而且在包外的代 码不能访问该类。这使得各个类之间有隐私,但不被外界所知。 创建一个包是很简单的:只要包含一个package命令作为一个Java源文件的第 一句就可以了。该文件中定义的任何类将属于指定的包。package语句定义了一 个存储类的名字空间。如果省略package 语句,类名被输入一个默认的没有名 称的包(这是为什么在以前不用担心包的问题的原因)。尽管默认包对于短例 程序很好用,但对于实际的应用程序是不适当的。多数情况,需要为自己的代 码定义一个包。下面是package声明的一般形式: package pkg; 这里,pkg为包名。Java用文件系统目录来存储包。记住这种规则是很重要的 ,目录名称必须和包名严格匹配。多个文件可以包含相同package声明。 package声明仅仅指定了文件中所定义的类属于哪一个包。它不拒绝其他文件的 其他方法成为相同包的一部分。多数实际的包伸展到很多文件。我们可以创建 包层次。为做到这点,只要将每个包名与它的上层包名用点号“.”分隔开就可以 了。一个多级包的声明的通用形式如下: package pkg1.pkg2.pkg3; 包层次一定要在Java开发系统的文件系统中有所反映。 Return 6.1.2 关于类路径 假设你在一个test包中创建了一个名为PackTest 的类。由于你的目录结 构必须与包相匹配,创建一个名为test的目录并把PackTest.java装入该目 录。然后,使test 成为当前目录并编译PackTest.java。这导致 PackTest.class被存放在test目录下。当试图运行PackTest时,java 解释 器报告一个与“不能发现PackTest类”相似的错误消息。这是因为该类现在 被保存在test包中,不再能简单用PackTest来引用。必须通过列举包层次 来引用该类。引用包层次时用点号将包名隔开。该类现在必须叫做 test.PackTest。然而,如果你试图用test.PackTest,将仍然收到一个与“ 不能发现test/PackTest类”相似的出错消息。 仍然收到错误消息的原因隐藏在类路径变量中。记住,类路径设置顶层类 层次。问题在于在当前工作目录下不存在test子目录,因为你此时是工作 在test目录。在这个问题上你有两个选择:改变目录到上一级然后用java test.PackTest,或者在类路径环境变量增加开发类层次结构的顶层。然后 就可以使用java test.PackTest了。例如,如果源代码在目录C:myjava下 ,那么应设置类路径为: .;C:myjava;C:javaclasses Return 6.1.3 一个简单的例子 详细分析并运行教材P156157页使用 包的例子。 Return 6.1.4 访问保护 在前面的章节中已经学习了Java的访问控制机制和访问说明符 。例如,我们已经知道一个类的private成员仅可以被该类的其他成 员访问。包增加了访问控制的另一个维度。正如读者所看到的, Java提供很多级别的保护以使在类、子类和包中有完善的访问控制 。 类和包都是封装和容纳名称空间和变量及方法范围的方法。包就 像盛装类和下级包的容器。类就像是数据和代码的容器。类是Java 的最小的抽象单元。因为类和包的相互影响,Java将类成员的可见 度分为四个种类: l 相同包中的子类 l 相同包中的非子类 l 不同包中的子类 l 既不在相同包又不在相同子类中的类 三个访问控制符,private、public和protected,提供了多种 方法来产生这些种类所需访问的多个级别,教材P158页表6-1中总结 了它们之间的相互作用。 1关于访问保护 分析教材P158160页的例子,该例显示了访问修饰符的所有组 合,在该例中有两个包和五个类。记住,这两个不同包中的类需要 被存储在以它们的包p1、p2命名的目录下。 第一个包中定义了三个类:Protection, Derived, 和 SamePackage。第一个类以合法的保护模式定义了四个int变量。变 量n声明成默认受保护型。n_pri是private型,n_pro是protected, n_pub是public的。 该例中每一个后来的类试图访问该类一个实例中的变量。根据 访问权限不编译的行用单行注释/。在每个这样的行之前都是列举 该级保护将允许访问的地点的注释。 第二个类,Derived是同样包p1中Protection类的子类,这允许 Derived访问Protection中的除n_pri以外的所有变量,因为它是 private。第三个类,SamePackage,不是Protection的子类,但是 是在相同的包中,也可以访问除n_pri以外的所有变量。 Return 2一个访问的例子 6.1.5 包的导入 包的存在是划分不同类的好的机制,了解为什么所有Java内部的类都存在包 中是很简单的。在未命名的默认包中,不存在核心Java类;所有的标准类都 存储在相同的包中。既然包中的类必须包含它们的包名才能完全有效,为每 个想用的包写一个长的逗点分离的包路径名是枯燥的。因为这点,Java包含 了import语句来引入特定的类甚至是整个包。一旦被引入,类可以被直呼其 名的引用。import语句对于程序员是很方便的,而且在技术上并不需要编写 完整的Java程序。如果你在程序中将要引用若干个类,那么用import 语句将 会节省很多打字时间。 在Java源程序文件中,import语句紧接着package语句(如果package 语句 存在),它存在于任何类定义之前。下面是import声明的一般形式 import pkg1.pkg2.(classname|*); 这里,pkg1是顶层包名,pkg2是在外部包中的用逗点(.)隔离的下级包名 。除非是文件系统的限制,不存在对于包层次深度的实际限制。最后,要么 指定一个清楚的类名,要么指定一个星号(*),该星号表明Java编译器应该 引入整个包。分析教材P161162页的例子。 Return 6.2 接口 在前面的章节中,我们已知道如何在类中 定义接口的方法。通过使用关键字interface ,Java允许编程人员充分抽象它实现的接口。 接口自己不定义任何实现,尽管它与抽象类相 似。 6.2.1 关于接口 6.2.2 接口的定义 6.2.3 接口的实现 6.2.4 接口的使用 6.2.5 接口中的变量 6.2.6 接口的扩展 Return 6.2.1 关于接口 接口是用来实现类间多重继承的功能的,它将完成特定功能的若干属性组织成相对独立 的属性集合,该属性集合就是接口。例如,ActionListener接口的功能与 actionPerformed()方法相关。 需要指出的是,接口定义的仅仅是实现某一特定功能的一组功能的对外接口和规范,而 并没有真正实现这个功能。真正实现在继承这个接口的各个类中完成,因而通常把接口功 能的继承称为“实现”。 如果一个类要实现接口时,需要注意以下几个方面的内容: (1)在类的声明部分,用implements关键字声明该类将要实现哪些接口。 (2)如果实现某接口的类不是abstract的抽象类,则在类的定义部分必须实现指定接口 的所有抽象方法。 (3)如果实现某接口的类是abstract的抽象类,则它可以不实现该接口所有的方法。但 是对于这个抽象类任何一个非抽象的子类面言,它们父类所实现的接口中的所有抽象方法 都必须有实在的方法体。 (4)一个类在实现某接口的抽象方法时,必须使用完全相同的方法头,如果所实现的方 法与抽象方法有相同的方法名和不同的参数列表,则只是在重载一个新的方法,而不是实 现已有的抽象方法。 (5)接口的抽象方法的访问限制符都已指定为public,所以类在实现方法时,必须显 式地使用public修饰符,否则将被系统警告为缩小了接口中定义的方法的访问控制范围。 Return 6.2.2 接口的定义 用关键字interface,你可以从类的实现中抽象一个类的接口。接口在语句构成 上与类相似,但是它们缺少实例变量,而且它们定义的方法是不含方法体的。实 际上,这意味着你可以定义不用假设它们怎样实现的接口。一旦接口被定义,任 何类成员可以实现一个接口。而且,一个类可以实现多个接口。 要实现一个接口,接口定义的类必须创建完整的一套方法。然而,每个类都可 以自由地决定它们自己实现的细节。通过提供interface关键字,Java允许你充 分利用多态性的“一个接口,多个方法”。 接口是为支持运行时动态方法解决而设计的。接口的定义很像类的定义。下面 是一个接口的通用形式。 access interface name return-type method-name1(parameter-list); return-type method-name2(parameter-list); type final-varname1 = value; type final-varname2 = value; / . return-type method-nameN(parameter-list); type final-varnameN = value; Return 这里,access要么是public,要么就没有用修饰符。当没有访问修饰符时,则是默 认访问范围,而接口是包中定义的唯一的可以用于其他成员的东西。当它声明为 public时,接口可以被任何代码使用。name是接口名,它可以是任何合法的标识符 。注意定义的方法没有方法体。它们以参数列表后面的分号作为结束。它们本质上 是抽象方法;在接口中指定的方法没有默认的实现。每个包含接口的类必须实现所 有的方法。 接口声明中可以声明变量。它们一般是final和static型的,意思是它们的值不能通 过实现类而改变。它们还必须以常量值初始化。如果接口本身定义成public ,所有 方法和变量都是public的。 下面是一个接口定义的例子。它声明了一个简单的接口,该接口包含一个带单个整 型参数的callback()方法。 interface Callback void callback(int param); 6.2.3 接口的实现 一旦接口被定义,一个或多个类可以实现该接口。为实现一个接口 ,在类定义中包括implements 子句,然后创建接口定义的方法。一 个包括implements 子句的类的一般形式如下: access class classname extends superclass implements interface ,interface. / class-body 这里,access要么是public的,要么是没有修饰符的。如果一个 类实现多个接口,这些接口被逗号分隔。如果一个类实现两个声明了 同样方法的接口,那么相同的方法将被其中任一个接口客户使用。实 现接口的方法必须声明成public。而且,实现方法的类型必须严格与 接口定义中指定的类型相匹配。 我们可以把变量定义成使用接口的对象引用而不是类的类型。任何 实现了所声明接口的类的实例都可以被这样的一个变量引用。当通过 这些引用调用方法时,在实际引用接口的实例的基础上,方法被正确 调用。这是接口的最显著特性之一。被执行的方法在运行时动态操作 ,允许在调用方法代码后创建类。调用代码在完全不知“调用者”的 情况下可通过接口来调度。这个过程和前面章节中描述的用超类引用 来访问子类对象很相似。 Return 1通过接口引用实现接口 2局部实现 如果一个类包含一个接口但是不完全实现接口定义的方法,那 么该类必须定义成abstract型。例如: abstract class Incomplete implements Callback int a, b; void show() System.out.println(a + “ “ + b); / . 6.2.4 接口的使用 为理解接口的功能,让我们看一个更实际的例子。我们曾开发过一个名 为Stack的类,该类实现了一个简单的固定大小的堆栈。然而,有很多方 法可以实现堆栈。例如,堆栈的大小可以固定也可以不固定。堆栈还可 以保存在数组、链表和二进制树中等。无论堆栈怎样实现,堆栈的接口 保持不变。也就是说,push( )和pop( )方法定义了独立实现细节的堆 栈的接口。因为堆栈的接口与它的实现是分离的,很容易定义堆栈接口 ,而不用管

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论