第五章 java语言的接口
引子:在家中你能把电灯的插头拔掉,然后接上你的手提电脑.这是因为电灯和手提电脑都实现这插座的这个接口.
什么是接口?
一个java接口(Interface)是一些方法特征的集合,这些方法特征当然来自于具体方法,但是他们一般都是来自于一些在系统不断出现的方法,一个接口只有方法的特征.而没有方法的实现,因此这些方法在不同的地方被实现,可以具有完全不同的行为.在java语言中,java接口还可以用来定义public的常量.
为什么使用接口?
由于java语言是一个单继承的语言,一个类只能有一个超类.因此,在很多情况下,这个具体类可能已经有了一个超类,这时候要给他加上一个新的超类是不可能的,如果硬要的话,就只好把这个新的超类加到已有的超类上面,形成超超类的情况:如果这个超超类的位置也已经被占用了,就只好继续向上移动.直到移动到类等级结构的顶端.这样一来,对一个具体类的可插入性设计,就变成了对整个等级结构中的所有类的修改.
接口是对可插入性的保证.
关联的可插入性
当前对象并不在意所关联的是哪一个具体的类,而仅仅关心这个类是否实现了这个接口.
调用的可插入性
当需要调用其他类的方法时,这种调用不一定非得是某一个具体类,可以是一个接口.这样任何实现了这个接口的具体类都可以被当前对象调用.*跟关联的可插入性是一致的.
java接口常见的用法.
单方法接口
标示接口
如java.io.Serializable
常量接口
用来定义常量,只要实现这个接口就能直接调用常量,而不用这样使用(Utils.MAX)
第六章 专题:抽象类
什么是抽象类
抽象类仅提供一个类型的部分实现.抽象类可以有实例变量,以及一个或多个构造子.抽象类可以同时有抽象方法和具体方法.一个抽象类不能实例化,所以抽象类都是用来继承的.
Scott Meyers 曾指出 只要有可能,不要从具体类继承.
代码重构的建议
抽象类应当拥有尽可能多的共同代码.*也就是说:在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量的移到抽象类里.这对复用是有易的.
抽象类应当拥有尽可能少的数据*数据的移动方向是从抽象类到具体类.也即从继承的等级结构的高端向等级结构的地段移动.这样能保证节省内存资源.
针对抽象编程
什么时候才应当使用继承复用(一般建议使用接口)
1.子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分"Has-A"与"Is-A"两种关系的不同.Has-A使用聚合关系,Is-A使用继承关系.
2.永远不会出现需要将子类换成另一个类的子类的情况.
3.子类具有扩展超类的责任,而不是具有置换掉(OVERRIDE)或注销掉超类的责任.
4.只有在分类角度上有意义时,才可以使用继承,不要从工具类继承.