9.1.4 接口pk. 抽象类
接口和抽象类虽然有相似之处,即它们都可能有抽象方法。但却有本质的不同。首先在代码编写方面,它们的语法要求存在差异。从这个角度讲,接口是纯粹抽象的类;而抽象类是一般类到接口之间的过渡。表9.1列出了接口和抽象类在语法方面的不同。
表9.1 接口和抽象类的区别
| 接 口 | 抽 象 类 |
| 静态常量 | 一般变量 常量 静态变量 静态常量 |
| 抽象方法 | 方法 静态方法 抽象方法 抽象静态方法 |
| 使用关键字interface | 使用关键字abstract |
可以看出,Java对接口的语法有严格的限制和要求;而抽象类则是一种松散形式的抽象。它的特例可以和一般类一样,只不过标有关键字abstract而已。
接口和抽象类都不能创建对象。它们的不同主要在于应用。抽象类源于C++语言。但在C++中没有abstract关键字来定义抽象类,只是利用virtual来表示某个将要实现多态的方法,相当于名义抽象类。Java中的抽象类,还是C++中名义上的抽象类,一般用来进行和多态有关的运行和操作。
接口的主要用途可以归纳为如下几点:
<!--[if !supportLists]-->l <!--[endif]-->事件处理规范。如API中的EventListener,ActionListener,WindowListener,MouseListener等等。
<!--[if !supportLists]-->l <!--[endif]-->识别对象规范。如API中的Comparable,Cloneable,等等。
<!--[if !supportLists]-->l <!--[endif]-->输出输入规范。如编程人员自定义的Printable,FileWriter,Readable,等等。
<!--[if !supportLists]-->l <!--[endif]-->连接协议规范。如Connectable等。
<!--[if !supportLists]-->l <!--[endif]-->特殊变量规范。如枚举变量协议接口Enumable。
<!--[if !supportLists]-->l <!--[endif]-->高层次组织和控制结构规范。如API中的Collection 接口,List接口,等等。
<!--[if !supportLists]-->l <!--[endif]-->具有普遍意义的周边和附属功能规范。如Recycleable,Colorable,Positionable,等等。
本章以下小节对接口在这些方面的应用作进一步讨论。表9.2列出了接口和抽象类在应用方面的比较。
表9.2 接口和抽象类在应用方面的比较
| 应 用 | 接 口 | 抽 象 类 |
| 多重继承 | 一个类可以完善多个接口,即支持间接多重继承。 | 一个类只可以继承一个抽象类。 |
| 第三方开发和 扩展 | 可以在任何第三方已存在类的代码中实现接口。 | 为了继承抽象类,第三方类必须重写子类。 |
| “like a”与“is a” | 通常对边缘和附属功能提出协议性规范;具有广泛性。 | 通常定义对象的核心形态和行为。 |
| 同性 | 适用于所有实现共享签名和协议的不同应用。 | 适用于各种不同的实现、但都基于共同状态和行为源的应用。 |
| 自由度 | 只要“像我”。 | 必须“是我”。 |
| 可维性 | 相同 | 相同 |
| 速度 | 相对慢 | 相对快 |
| 简洁性 | 高。无须关键字,所有数据自动为公有静态常量。所有方法自动为抽象。 | 低。关键字不可省略。 |
| 可扩充性 | 如果在接口中添加新方法协议,必须修改所有应用它的类的代码。 | 如果添加完善了的新方法,无须对所有应用它的类进行修改。 |
9.1.5 常用API接口
在Java API的每个包中,几乎都规定了接口,以及完善这些接口需要的技术支持和处理的异常。随着本书的深入讨论,将逐步介绍应用和完善一些常用接口的实例。表9.3中列出了这些API常用接口。
表9.3 常用API接口
| 接 口 名 | 常量/方法 | 包 名 | 功 能 | 讨论章节 |
| Cloneable | 无。推荐覆盖Object.clone() | java.lang | 对象拷贝 | 9 |
| Comparable | int compareTo(Object o) | java.lang | 对象排序 | 10 |
| Runnable | void run() | java.lang | 线程运行 | 14 |
续表
| 接 口 名 | 常量/方法 | 包 名 | 功 能 | 讨论章节 |
| AudioClip | void loop() void play() void stop() | java.applet | 音频播放 | 20 |
| ActionListener | void actionPerformed(ActionEvent) | java.awt.event | 事件处理 | 17,18 |
| WindowConstants | int DISPOSE_ON_CLOSE int DO_NOTHING_ON_CLOSE int EXIT_ON_CLOSE int HIDE_ON_CLOSE | javax.swing | 窗口控制 | 18 |
标签:数码 科技 网络

