9.1.4 接口pk. 抽象类
接口和抽象类虽然有相似之处,即它们都可能有抽象方法。但却有本质的不同。首先在代码编写方面,它们的语法要求存在差异。从这个角度讲,接口是纯粹抽象的类;而抽象类是一般类到接口之间的过渡。表
9.1
列出了接口和抽象类在语法方面的不同。
表
9.1
接口和抽象类的区别
接
口
|
抽
象
类
|
静态常量
|
一般变量
常量
静态变量
静态常量
|
抽象方法
|
方法
静态方法
抽象方法
抽象静态方法
|
使用关键字
interface
|
使用关键字
abstract
|
可以看出,
Java
对接口的语法有严格的限制和要求;而抽象类则是一种松散形式的抽象。它的特例可以和一般类一样,只不过标有关键字
abstract
而已。
接口和抽象类都不能创建对象。它们的不同主要在于应用。抽象类源于
C++
语言。但在
C++
中没有
abstract
关键字来定义抽象类,只是利用
virtual
来表示某个将要实现多态的方法,相当于名义抽象类。
Java
中的抽象类,还是
C++
中名义上的抽象类,一般用来进行和多态有关的运行和操作。
接口的主要用途可以归纳为如下几点:
l
事件处理规范。如
API
中的
EventListener
,
ActionListener
,
WindowListener
,
MouseListener
等等。
l
识别对象规范。如
API
中的
Comparable
,
Cloneable
,等等。
l
输出输入规范。如编程人员自定义的
Printable
,
FileWriter
,
Readable
,等等。
l
连接协议规范。如
Connectable
等。
l
特殊变量规范。如枚举变量协议接口
Enumable
。
l
高层次组织和控制结构规范。如
API
中的
Collection
接口,
List
接口,等等。
l
具有普遍意义的周边和附属功能规范。如
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
|
本文转自高永强51CTO博客,原文链接:http://blog.51cto.com/yqgao/178420
,如需转载请自行联系原作者