当前课程知识点:“做中学”Java程序设计 >  第4章使用面向对象高级语法 >  4.5使用接口 >  Video

返回《“做中学”Java程序设计》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《“做中学”Java程序设计》慕课在线视频列表

Video课程教案、知识点、字幕

在上一节课当中 抽象类向我们展示了比具体类更加强大的灵活特性

你可能已经注意到程序设计的灵活性 往往和抽象性是成正比的

越是抽象 也就给具体的实现 留下了灵活的余地

从而也意味着它的灵活性就更大

那么我们今天要来介绍的接口 你可以将它看成是一个更加纯粹的抽象类型

接口如协议一样 描述了接口的实现者对外部的一种承诺

这样其它对象就可以根据这个协议 来和实现接口的对象进行交流

在语法上 定义一个接口的语法 和 定义类是非常类似的

只需要将关键字class 替换成interface

与抽象类不同 它除了定义一些公有的抽象方法之外 不能定义任何的实例方法

此外 接口当中的方法签名默认的已经隐含了 public 和 abstract 修饰符

所以不管你是否将它们显示的写出来 它们都是 public 和 abstract

这也就意味着 接口当中定义的方法 必须由它的实现者 来一一实现

同样 接口当中定义的变量也不是普通的实例变量 它只能是静态常量

这就意味着 当你在接口当中定义变量时 它默认隐含了 public final static 修饰符

不管你是否显式地将它们写出来 它们都隐含在那里

最后 变量名还要遵守全部大写的约定 同时还要初始化

再使用接口的时候 需要特别注意 接口应用的相关规则

对于一个实现类而言 它既可以具有继承关系 又具有接口的实现功能

在继承关系当中我们曾经讲过 一个类只能继承一个父类

而接口的实现可以不同 一个类可以实现多个接口

你需要在多个接口当中使用逗号将它们分隔

需要记住的是 接口呢 只能通过子类来实现 而不是通过继承来覆盖

接口呢 是一种新的数据类型 它的使用呢 也符合“里氏替换原则”

所以我们可以用接口来实现 面向对象的多态特性

下面呢 我们通过具体示例来看看如何来实现接口了

这段代码来自于JDK当中的String的代码片段

可以看到String类型实现了三个接口

Comparable 是其中的一个接口

这个接口当中定义了一个可比较的抽象方法compare To方法

任何可比较类型都可以直接去实现这个接口 从而具有可比较的功能

我们这里的String 实现了这个接口 也就赋予了可比较的功能

需要特别注意的是 这里的尖括号 是一个泛型的描述

表示这里要比较的对象类型必须是一个String类型

在随后的代码的相应位置上 实现了这个接口当中定义的抽象方法

这些代码片段就是这个方法的具体实现

我们也可以查看一下CharSequence这个接口 这个接口当中定义了四个抽象方法

因此 你必须在String当中一一对这四个抽象方法呢 进行实现

在代码的相应位置上 我们可以看到这个方法的具体实现

再来观察一下Serializable接口 你会惊讶的发现 该接口当中没有定义任何的方法

这里大家需要记住 接口和类一样 是一种数据类型

由于接口当中定义的方法都是抽象的

显然你就无法实例化它们

那么这种数据类型有何作用呢

回顾上节课的内容 结合同样符合我们的“里氏替换原则”

你可以利用接口定义的引用变量去指向任何一个实现者的对象

或者说 你也可以使用接口来实现面向对象的多态特性

相对于抽象类来实现多态 使用接口 具有更大的灵活性

因为抽象类受限于类的继承关系 每个类呢 只能继承一个父类

而接口打破了这个限制

一个类也可以实现多个接口 所以你可以灵活的去组织这些接口

因此 在实际的使用过程当中 使用接口的场合 远远要比抽象类要多的多

知道了这一点 我们就不难理解

一个Serializable接口 虽然它里面没有定义任何的抽象方法

但这种做法声明了一个新的数据类型 能够让子类来实现这个接口

就可以让子类 具有这个特定的身份标识

下面我们来看“学生信息管理系统”当中的任务

这里有一个需求是:我们需要根据不同的学生类型 进行相应的积分策略的设计

对于普通的学生 如果它的成绩等级是A 那么将得到四分

如果等级是B 将得到三分

如果等级是C 将得到两分

如果等级是D 将得到一分

其它的等级呢 不给分

对于获得荣誉的学生 它的各项等级得分要比普通的学生多一分

此外 尖子班的学生也有自己的一套积分规则

类似这样的问题 我们可以把经常需要变动的部分 抽象出一个统一的接口

从而 设计成接口实现的形式来应对

这张类图当中的《interface》标注 告诉我们这里的 GradingStrategy 是一个接口

虚线加空心箭头的组合 表述的是一个实现关系

这里的子类 RegularGradingStrategy 、HonorsGradingStrategy 和 EliteGradingStrategy 分别实现了这个接口

而每个 Student 对象 拥有自己的一套积分策略

在定义接口之前 我们先向项目当中导入写好的Grade类

将这个文件从桌面上 拖放到我们的 proj03 的包当中

接下去我们来实现接口 在包 proj03 当中 单击右键 选择新建

这次呢我们选择 interface 接口

在接口的名称当中输入 GradingStrategy

单击 回车

在接口的框架当中 我们写上一个抽象方法 public int getGradePointsFor

好 我们的接口就这样定义好了 是不是非常简单呢

但是 你需要注意的是 尽管我没有加上 abstract 修饰符 但是它是隐含在里面的

通常 在接口当中我们定义方法的时候 我们可以把 abstract 省略 以保持简洁

下面呢 我们来创建一个新的类

在类的向导对话框当中

我们把这个类的名字呢取名为 RegularGradingStrategy

这个类作为普通学生的一个积分策略 从而要实现我们刚才定义的接口

那么 在创建这个类的向导对话框当中 你可以直接在 interface 这一栏的右侧

单击 Add... 这个按钮 来添加多个要实现的接口

这里呢 我们就找到刚才定义的GradingStrategy

单击 Finish 完成 我们可以看到自动生成的代码框架当中呢 已经把接口的实现语法写好了

同时要求你完成 对接口当中的抽象方法进行定义

要实现这个抽象方法 我们只需要根据需求 使用简单的几个 if 语句就能实现完成

就像这样写

当它的成绩等于 A 的时候 我们将返回四分

当它的成绩等于 B 的时候 我们返回三分

当它的成绩是 C 的时候 我们将返回两分

如果是 D 则返回一分

其它就不给分 return 0;

好了 一个简单的 RegularGradingStrategy 就这样实现完毕

使用同样的方式要实现 HonorsGradingStrategy 就不难了 同学们可以自己动手试试看

最后 作为学生 他需要拥有一套自己的积分策略

那么 我们可以将这个积分策略 作为类的 Student 的一个实例变量保存进去

作为学生数据的一部分 我们可以找到学生类

在这个类的相应的位置上 定义一个实例变量

为了保存不同的积分策略 我们将它的数据类型定义为 GradingStrategy 接口类型

将它初始化成 RegularGradingStrategy 子类对象

同时 为了能够改变这个对象信息 我们给它提供一套setter getter方法

从而保证 外界能够指定学生的积分策略对象

好了 剩下的测试代码的工作就交给你

今天的接口的用法你学会了吗?

在今天的课程当中 我们学习了接口的 基本概念 定义语法 以及它的应用示例

接口作为一种抽象手段 为Java的多态实现提供了重要支持

对于它的理解和掌握 有助于你学习和掌握Java当中的高级主题

“做中学”Java程序设计课程列表:

第1章初始Java

-1.1Java简介

--01Java简介

-1.2搭建Java开发环境

--Video

-1.3使用记事本编写Java程序

--Video

-1.4使用Eclipse开发Java程序

--Video

-1.5导入/导出Java项目

--Video

-1.6管理组织代码

--Video

-第1章初始Java--测试题

第2章使用Java基本语法(1)

-2.1认识标识符

--Video

-2.2变量和变量类型

--Video

-2.3数据类型和类型转换

--Video

-2.4使用常量

--Video

-2.5使用注释

--Video

-2.6使用运算符进行算术运算

--Video

-第2章使用Java基本语法(1)--测试题

第2章使用Java基本语法(2)

-2.7使用运算符进行逻辑处理

--Video

-2.8使用if进行流程控制

--Video

-2.9使用switch进行流程控制

--使用switch进行流程控制

-2.10使用循环

--Video

-2.11循环的跳出和继续

--Video

-2.12多重循环

--Video

-第2章使用Java基本语法(2)--测试题

第3章使用面向对象基础语法

-3.1认识类和对象

--Video

-3.2为类添加属性

--Video

-3.3为类添加方法

--Video

-3.4为类添加静态方法

--Video

-3.5递归方法

--递归方法

-3.6构造方法

--Video

-3.7重载方法

--Video

-第3章使用面向对象基础语法--测试题

第4章使用面向对象高级语法

-4.1使用继承语法

--Video

-4.2使用数组

--Video

-4.3使用数组类操作数组

--Video

-4.4使用抽象类

--Video

-4.5使用接口

--Video

-第4章使用面向对象高级语法--测试题

第5章捕获并处理异常

-5.1异常处理机制

--Video

-5.2捕获异常

--Video

-5.3创建自定义异常

--Video

-第5章捕获并处理异常--测试题

第6章使用SWT设计界面

-6.1SWT图形界面

--Video

-6.2使用SWT布局管理-FillLayout

--使用SWT布局管理-FillLayout

-6.3使用SWT布局管理-RowLayout

--使用SWT布局管理-RowLayout

-6.4SWT中的事件模型

--Video

-6.5常见事件处理写法

--Video

-第6章使用SWT设计界面--测试题

第7章微波炉模拟程序

-7.1微波炉模拟程序的界面制作

--Video

-7.2微波炉模拟程序的代码重构

--Video

-7.3微波炉模拟程序的事件监听

--Video

-7.4微波炉模拟程序的数字键盘

--Video

-7.6微波炉模拟程序CookTimer

--Video

-7.7微波炉模拟程序添加图像

--Video

-7.8微波炉模拟程序添加声音

--Video

-7.9微波炉模拟程序安装包制作

--Video

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。