接口优于抽象类——《effective Java》第三版

        Java 提供了两种机制,可以用来定义允许多个实现的类型:接口和抽象类。自从 Java 为继承引人了缺省方法(default method),这两种机制都允许为某些实例方法提供实现。主要的区别在于,为了实现由抽象类定义的类型,类必须成为抽象类的一个子类。因为 Java只允许单继承,所以用抽象类作为类型定义受到了限制。任何定义了所有必要的方法并遵守通用约定的类,都允许实现一个接口,无论这个类是处在类层次结构中的什么位置。

        现有的类可以很容易被更新,以实现新的接口。如果这些方法尚不存在,你所需要做的就只是增加必要的方法,然后在类的声明中增加一个 implements 子句。例如,当Comparable、Iterable 和 Autocloseable 接口被引人 Java 平台时,更新了许多现有的类,以实现这些接口。一般来说,无法更新现有的类来扩展新的抽象类。如果你希望两个类扩展同一个抽象类,就必须把抽象类放到类型层次(type hierarchy)的高处,这样它就成了那两个类的一个祖先。遗憾的是,这样做会间接地伤害到类层次,迫使这个公共祖先的所有后代类都扩展这个新的抽象类,无论它对于这些后代类是否合适。

        接口是定义 mixin(混合类型)的理想选择。不严格地讲,mixin 类型是指:类除了实现它的“基本类型”之外,还可以实现这个 mixin 类型,以表明它提供了某些可供选择的行为。例如,Comparable 是一个 mixin 接口,它允许类表明它的实例可以与其他的可相互比较的对象进行排序。这样的接口之所以被称为 mixin,是因为它允许任选的功能可被混合到类型的主要功能中。抽象类不能被用于定义 mixin,同样也是因为它们不能被更新到现有的类中:类不可能有一个以上的父类,类层次结构中也没有适当的地方来插入mixin。

       接口允许构造非层次结构的类型框架。类型层次对于组织某些事物是非常合适的,但是其他事物并不能被整齐地组织成一个严格的层次结构。例如,假设我们有一个接口代表一个 singer(歌唱家),另一个接口代表一个 songwriter(作曲家):

public interface Singer {

AudioClip sing(Song s);

public interface Songwriter {

Song compose(int chartPosition);

}

       在现实生活中,有些歌唱家本身也是作曲家。因为我们使用了接口而不是抽象类来定义这些类型,所以对于单个类而言,它同时实现 Singer和 Songwriter是完全允许的。实际上,我们可以定义第三个接口,它同时扩展 Singer 和Songwriter,并添加一些适合于这种组合的新方法:

public interface SingerSongwriter extends Singer, Songwriter i

{

AudioClip strumO;

void actSensitiveO;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是为全英文版本。 《Java完美编程(第3版)》,英文名《Absolute Java (3rd Edition)》,英文版出版社:Addison Wesley,作者:【美】Walter Savitch。本书是为 PDF 格式,按照章节分为不同的 19 个部分,总大小 17 MB。 内容简介:   《java完美编程(第3版)》侧重于面向对象设计,通过浅显易懂的语言和代码,很好地平衡了完整实例和解释性讨论,并围绕着java语言的特征全面、透彻地介绍诸多编程技术。书中全面介绍java语言已经实现的封装、继承和多态性技术,在介绍swing gui的时候提及事件驱动的编程并提供很多练习。在介绍uml和模式的同时进一步介绍了oop。    本书不仅可作为高等院校程序设计课程的入门教材,还可作为使用java的后续计算机科学课程的参考书。 目录: 第1章 java入门  引言  前导知识   1.1 java简介   1.2 表达式和赋值语句   1.3 string类   1.4 程序风格   小结   自测题参考答案   编程项目  第2章 控制台输入和输出   引言   前导知识   2.1 屏幕输出   2.2 使用scanner类的控制台输入   小结   自测题参考答案   编程项目  第3章 控制流   引言  . 前导知识   3.1 分支结构   3.2 布尔表达式  3.3 循环  3.4 调试  小结   自测题参考答案   编程项目 第4章 类的定义(1)  引言   前导知识   4.1 类的定义   4.2 信息隐藏和封装  4.3 重载  4.4 构造方法   小结   自测题参考答案   编程项目 第5章 类的定义(2)  引言   前导知识   5.1 静态方法和静态变量   5.2 引用和类参数  5.3 引用的使用和滥用   5.4 包和javadoc  小结   自测题参考答案   编程项目 第6章 数组   引言   前导知识   6.1 数组概述   6.2 数组与引用  6.3 数组编程  6.4 多维数组  小结   自测题参考答案   编程项目 第7章 继承  引言   前导知识   7.1 有关继承的基础知识    7.2 封装和继承   7.3 继承编程   小结   自测题参考答案   编程项目 第8章 多态性和抽象类 第9章 异常处理 第10章 文件i/o 第11章 递归 第12章 uml和模式 第13章 借口和内部类 第14章 泛型和arraylist类 第15章 链式数据结构 第16章 稽核,映射和迭代器 第17章 初探swing  第18章 深入swing 第19章 java的发展永无止境
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值