专题:java语言的接口和抽象类

上传人:小** 文档编号:79264182 上传时间:2019-02-16 格式:PPT 页数:20 大小:79KB
返回 下载 相关 举报
专题:java语言的接口和抽象类_第1页
第1页 / 共20页
专题:java语言的接口和抽象类_第2页
第2页 / 共20页
专题:java语言的接口和抽象类_第3页
第3页 / 共20页
专题:java语言的接口和抽象类_第4页
第4页 / 共20页
专题:java语言的接口和抽象类_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《专题:java语言的接口和抽象类》由会员分享,可在线阅读,更多相关《专题:java语言的接口和抽象类(20页珍藏版)》请在金锄头文库上搜索。

1、专题:Java语言的接口和抽象类,在家里,可以很容易地将一个电器从电源插座上拔下,然后将另一个电器插上。对于电源来说,这些电器都是可插入构件(Pluggable Component)。它们之所以是可插入的,是因为它们都具有与电源插座相匹配的插头。 可插入构件:如果可以动态地将一个构件移走,并以另一个构件取而代之,那么这种构件就是可插入构件。 可以看出,所谓的接口,实际上就相当于电源插座;而可插入构件就相当于与这种插座相匹配的电器。正如电器的可插入性是由统一的电源插座及每个电器都有一个与之匹配的电源插头造成的一样,可插入构件的关键在于存在一个公用的接口,以及每个构件都实现了这个接口。 因此,接口

2、是实现构件的可插入性的关键。,什么是接口,Java接口是一些方法特征的集合,没有方法的实现。这些方法在不同的地方被实现时,可以具有完全不同的行为。,Java接口本身没有任何实现,因为Java接口不涉及具体,而只描述public行为,所以Java接口比Java抽象类更为抽象化。 一个Java接口的方法只能是抽象的和公开的, Java接口不能有构造方法。 实现一个共同的Java接口的两个类常常完全不同,但是有一组相同的方法。一些看上去毫不相干的类,可以因为提供相类似的服务,从而具有相同的接口。比如说,两个实现Runnable接口的类除了都有一个public void run()方法之外,可能没有其

3、他任何的共同点。,接口和类主要区别,接口仅仅描述方法的特征,而不给出方法的实现;类不仅给出方法的特征,而且给出方法的实现。,接口把方法的特征和方法的实现分割开来。这种分割,体现在接口常常代表一个角色,它包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。一个角色可以由不同的演员来演,而不同的演员之间除了扮演同一个角色之外,并不要求有其它的任何共同之处。,为什么使用接口,1. 接口是对可插人性的保证,在一个类等级结构中的任何一类都可以实现一个接口,这个接口会影响到此类的所有子类,但是不会影响到此类的任何超类。此类将不得不实现这个接口所规定的方法,而其子类则可以从此类自动继承到

4、这些方法,当然也可以选择置换掉所有的这些方法,或者其中的某一些方法。 这时候,这些子类就具有了可插入性。,关联的可插入性,一个对象需要完成一项任务,所以需要知道其他的对象,并且调用其他对象的方法。这个对象对其他对象的知识叫做关联(Association)。 如果一个关联不是针对一个具体类的,而是针对一个接口的,那么任何实现这个接口的类就都可以满足要求。换言之,当前对象并不在意所关联的是哪一个具体类,而仅仅关心这个类是否实现了某一个接口。 这样一来,就可以动态地将这个关联从一个具体类转换到另一个具体类,而这样做的唯一条件是它们都实现某个接口。,例如: 不要使用下面的声明语句: Vector em

5、ployees = new Vector(); / Vector是Java的一个类 而应该使用下面的声明语句: List employees = new Vector(); /List 是Java的一个接口 这样作的好处是,在决定将Vector类型转换成ArrayList时,需要改动得很少: List employees = new ArrayList();,调用的可插入性,同样,一个对象不可避免地需要调用其他对象的方法。这种调用不一定非得是某一个具体类,而可以是一个接口。这样一来,任何实现了这个接口的具体类都可以被当前对象调用;而当前对象到底调用的是哪一个具体类的实例则完全可以动态地决定。

6、因此,接口提供了关联以及方法调用上的可插入性,软件系统的规模越大,生命周期越长,接口的重要性就越大。接口使得软件系统在灵活性和可扩展性、可插入性方面得到保证。,例如: public class example List myList; public example(List aList ) myList=aList; public int getSize() return myList.size() public static void main(String args) ArrayList employees = new ArrayList(); example ep=new example

7、(employees); System.out.println(ep. getSize(); ,2. Java接口(以及Java抽象类)用来声明一个新的类型,Java设计师应当主要使用Java接口和抽象类将软件单位与内部和外部耦合起来。 换言之,应当使用Java接口和抽象类而不是具体类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型的转换等。当然,一个更好的做法是仅仅使用Java接口,而不要使用抽象Java类来做到上面这些。 在理想的情况下,一个具体Java类应当只实现Java接口和抽象类中声明过的方法,而不应当给出多余的方法。,3. Java接口(以及Java抽象类)一般

8、用来作为一个类型的等级结构的起点,Java的类型是以类型等级结构(Type Hierarchy)的方式组织起来在一个类型等级结构里面,一个类型可以有一系列的超类型(Supertype),这时这个类型叫做其超类型的子类型。 如果一个类已经有一个主要的超类型,那么通过实现一个接口,这个类可以拥有另一个次要的超类型。这种次要的超类型就叫做混合类型(Mixing Type)。 如前面所谈到的,当一个具体类处于一个类的等级结构之中的时候,为这个具体类定义一个混合类型是可以保证基于这个类型的可插入性的关键。因此,混合类型是一个非常重要的概念。 显然,Java接口是实现混合类型的最理想的工具。,什么是抽象类

9、,抽象类仅提供一个类型的部分实现。抽象类可以有实例变量,以及一个或多个构造方法。抽象类可以同时有抽象方法和具体方法。 一个抽象类不会有实例,这些构造方法不能被客户端调用来创建实例。一个抽象类的构造方法可以被其子类调用,从而使一个抽象类的所有子类都可以有一些共有的实现,而不同的子类可以在此基础上有其自己的实现。 抽象类和子类的这种关系实际上是模版方法模式的应用。,抽象类的用途,Java抽象类与Java接口一样,都用来声明一个新的类型,并且作为一个类型的等级结构的起点。但是,Java接口具有比Java抽象类更好的特性,因此,应当优先使用Java接口声明一个超类型。 抽象类通常代表一个抽象概念,它提

10、供一个继承的出发点。而具体类则不同,具体类可以实例化,应当给出一个有商业逻辑实现的对象模版。由于抽象类不可以实例化,因此一个设计师设计一个新的抽象类,一定是用来继承的。 而这一个声明倒过来也是对的:具体类不是用来继承的。,抽象类应当拥有尽可能多的共同代码,在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量移动到抽象类里。在一个继承的等级结构中,共同的代码应当尽量向等级结构的上方移动。 把重复的代码从子类里面移动到超类里面,可以提高代码的复用率。由于代码在共同的超类而不是几个子类中出现,在代码发生改变时,设计师只需要修改一个地方。这对代码的复用明显是有利的。 一个对象从超类继承而来的代码

11、,在不使用时不会造成对资源的浪费。,代码集中的方向,代码重构的建议,重构为,设计师应当将类A和类B的共同代码尽量移动到抽象超类C里面,这样可以保证最大限度的复用。,抽象类应当拥有尽可能少的数据,与代码的移动方向相反的是,数据的移动方向是从抽象类到具体类,也即从继承的等级结构的高端向等级结构的低端移动。 一个对象的数据不论是否使用都会占用资源,因此数据应当尽量放到具体类或者等级结构的低端。,数据集中的方向,抽象类的使用,1、针对抽象编程,不要针对具体编程 这就是依赖倒转原则(Inverse Dependency)。换言之,应当针对抽象类编程,不要针对具体子类编程,这一原则点出了抽象类对代码复用的

12、一个最重要的作用。 2、正确使用继承 在Java语言中,继承关系可以分成两种:一种是类对接口的实现,称做接口继承;另一种是类对类的继承,称做实现继承。第二种继承关系是很容易被滥用的一种复用工具。正如前面所指出的,抽象类是用来继承的,因此抽象类注定要与继承关联在一起,只要可能,尽量使用合成(Composition),而不要使用继承来达到复用的目的。,什么时候才应当使用继承复用,继承代表“一般化/特殊化”关系,其中基类代表一般,而衍生类代表特殊,衍生类将基类特殊化或扩展化。只有当以下的条件全部被满足时,才应当使用继承关系: (1)子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分“Has-A”与“Is-A”两种关系的不同。Has-A关系应当使用聚合关系描述,而只有Is-A关系才符合继承关系。,(2)子类具有扩展超类的责任,而不是具有置换掉(Override)或注销掉(Nullify)超类的责任。如果子类需要大量地置换掉超类的行为,那么这个子类不应当成为这个超类的于类。 (3)只有在分类学角度上有意义时,才可以使用继承,不要从工具类继承。一个工具类必定有自己的行为特性,一个商业类型封装了商业逻辑,不可能是工具类型一种。换言之,几乎没有例外,从工具类型继承是错误的。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号