抽象类和接口小析2

来源:互联网 发布:陕西广电网络e16-4 编辑:程序博客网 时间:2024/05/16 01:36

一、抽象类
在实际的项目开发中,遵循着“设计与实现分离”这样的原则,项目的代码一般分为结构代码和逻辑代码。比如,我们需要造一栋房屋,首先会设计好大致的结构,然后才开始一步一步的去建造。那么,在程序设计中,如何设计结构代码呢?我们一起来看看抽象类以及它的使用。
直观的说,包含抽象方法的类叫作抽象类。但是这个定义并不准确,因为一个抽象类完全可以不包含任何抽象方法。什么是抽象方法呢?抽象方法就是仅有声明,没有实现的方法。下面是抽象类与抽象方法的语法范例:
//抽象类的语法格式
abstract class ExamClass{
public abstract void method(); //抽象方法的语法格式
}
抽象类是一种特殊的类,它与没有使用abstract关键字修饰的类(也称实体类)的区别如下:
1、抽象类不能使用自身的构造器创建对象(但是抽象类是可以有构造器的,这点和实体类相同)。如果我们试图去创建一个抽象类的对象,编译器会给我们一条错误信息“ExamClass是抽象的;无法对其进行实例化”,这样就保证了抽象类的纯粹性,不必担心被误用。但是抽象类可以使用子类的构造器去创建对象。
2、抽象类的内部可以有任意多个抽象方法(包括0个)。抽象类可以没有抽象方法,而实体类不允许有抽象方法。
抽象方法是一种特殊的方法,它与实体方法之间存在着如下区别:
1、抽象方法只有声明没有实现,抽象方法没有方法体也就是说抽象类是没有“{}”的,
声明完方法,直接在"()"后加上“;”就可以了。
2、抽象方法只能在抽象类中出现,而实体方法可以既可以在抽象类中出现,也可以在实体类中出现。(当然,后面会讲到的接口中的方法虽然没有使用“abstract”修饰,但也是抽象的)
需要注意的是,如果从一个抽象类继承,并想创建该新类的对象,则必须为基类中所有抽象方法提供方法的实现,如果不这么做,那么这个新的类也必须为抽象类,编译器会强制我们使用“abstract”关键字来限定这个类。

说了这么多抽象类和抽象方法的知识,那么它有什么用呢?
1、严禁创建一个类的对象。我们可能会创建一个并没有任何抽象方法的抽象类,这个类中的所有方法都是static的,那么我们想阻止调用者创建这个类的任何对象。这个时候,只要将我们类声明为抽象的,这样调用者就只能通过类名去调用类中的静态方法。如果再配合final关键字,不允许该类被继承,就更加完美了。而Sun公司提供给我们的JDK中的Math类就是这么干的。
2、强制子类覆盖抽象方法。这样可以使所有的子类在方法的声明上保持一致,在逻辑上也必须将方法的功能保持一致。举一个万老师很喜欢举的例子——游戏,在怪物的设计中,每一个怪物都有攻击的方法,但是每种怪物攻击的方式和效果都不一样。通过使怪物的攻击的方法的声明保持一致,通过多态能够非常方便的调用这个方法了。

二、接口
接下来该接口出场了,接口与抽象类有一定的相似性,但同时也有很大的区别,接下来我们会一个一个的来了解。在现实生活中,我们见到过很多“接口”,比如计算机上的“USB”接口,通过这个接口,我们可以使用U盘,移动硬盘,USB鼠标,USB键盘,甚至USB风扇。试想,如果U盘使用一个独有的插槽,移动硬盘也使用自己的插槽,......那么我们的电脑上不是满身的“枪眼”?是不是能够感受到了接口带来的方便快捷?
其实,接口就是一套规范。这些规范规定了必须满足的条件,必须实现的功能,但没有规定如何实现。这种只规定实现的功能,而没有限制如何实现,就是我们前面所说的“设计与实现相分离”。接口规定实现的功能,属于设计部分,而如何实现这些功能属于实现部分。
说了这么多,我们还是来看看Java中的接口吧。接口声明的语法格式如下:
访问控制符 interface接口名 [extends父接口名1,父接口名2……]{
常量声明
方法声明
}

接口有这么些特点:
1、接口中只能声明方法,不能书写其实现,编译器会阻止任何这样的行为。
2、接口有两种访问权限修饰符,public和default(默认,即不加任何修饰符)。分别对应于公有的,和包可访问的权限。
3、接口中的域都是静态常量,即是static 和final的。接口中的域一旦初始化了就不能再改变了。
4、可以选择在接口中显示地将方法声明为public的,但即使我们不这么做,他们也是public的。当要实现一个接口时,在接口中被定义的方法必须为public,否则方法的访问权限就被降低了,这是Java的编译器所不允许的。
5、跟类的继承类似,接口之间也是可以继承的,当一个接口继承另一个接口后,子接口也就将父接口的域和方法的声明继承下来了。注意,因为接口中的方法都是public的,所以在子接口中可以访问父接口的所有方法。
6、类实现接口的语法格式是:
访问控制符 class ClassDemo implements 接口名{
接口的方法的实现
}
所有的类都可以实现接口,包括抽象类。如果实体类实现接口,则必须实现接口中的所有方法,如果是抽象类实现接口,可以选择实现部分方法,或则全部实现,当然也可以一个方法都不实现。
7、一个类可以实现任意多个接口,这样就使得类的通用性获得了极大地增强,能够很方便类的对象之间的匹配。

那接口怎么使用呢?
在实际的项目开发中,通过使用一定的接口,使得很多类的对象在实现某种类型的功能时,方法的声明是统一的,便于程序的调用和管理,利于项目的扩展。所以在现在的面向对象编程领域中,存在着另外的一个方向——面向接口的编程,其实很多Java的技术都是这样进行实现的,例如Java的JDBC部分。

三、抽象类与接口的面对面PK
抽象类和接口都是面向对象设计时用于设计结构的,那么在实际的开发中,就需要经常考虑这个问题了——“是改用抽象类,还是该用接口呢?”下面我们就一起来了解一下抽象类和接口之间的区别和联系。
二者之间的区别:1、抽象类是类,接口是接口。这么表述显得有点抽筋,但这句话也很好的区分了二者之间的区别。既然抽象类是类,那么抽象类就应该具有类所应用的特征,类所包含的内容(构造器,属性,方法,语句块)在抽象类内部也应该有,并且抽象类也跟普通类一样受到单继承的限制。而接口是接口类型,那么接口就用于上面我们所提到的接口的特征。一个类可以实现多个接口,所以接口也就不受单继承的限制。2、抽象类内部可以包含实体方法,甚至可以全是实体方法,而接口中不允许实体方法的存在。3、抽象类可以继承类也可以实现接口,而接口不能继承类,只能继承接口。

什么时候使用抽象类?如果我们在进行开发中遇到下面的情况,最好使用抽象类来进行设计:1、子类不再继承其他父类,那么这个时候我们可以将父类定义成抽象类;2、子类中存在相同功能的不同实现方式,这个时候我么也可以将父类定义为抽象类;3、子类中存在相同的属性,但具有不同的值是父类同样应该定义成抽象类;4、设计出的结构需要继承其他类,我们也需要将这个结构设计成抽象类。

那什么时候使用接口呢?如果我们在进行开发中符合如下情况时,最好使用接口:1、子类已经继承了其他的类,这个时候可以让子类实现某个接口来扩展子类的功能;2、子类不存在完全相同功能的实现方法,则可以将子类中具有相同功能的方法抽象出来形成接口;3、子类不存在完全相同的属性,并且需要一些静态常量时,可以使用接口,比如在JDK1.5之前,开发者就是通过接口来实现类似枚举的效果;4、设计出的结构不需要继承其他类时,将该结构声明为接口。

抽象类和接口的另类用途。1、禁止创建类的实例时,声明为抽象类;2、当需要存储大量的常量数据,并且这些数据需要在项目中的许多类使用时,可以使用接口;3、当需要统一具有某种功能 类的对象时,可以使用接口,如在学到对象的序列化后,会经常看到某个类实现Serializable接口。

最后再说明一下,抽象类接口在我们的开发中都不是必须的,都可以通过其他方式解决。是不是发现被耍了一样?介绍了半天,又说可以不使用。错了,在符合以上所列举的情况时,使用抽象类或者接口是一种很好的设计方式,而且在实际开发中使用也很多。

      以上文字是引用别人的感觉挺好的,下面说下我的一点儿点儿理解:

 

    就抽象类和接口来说,看你各个类的作用来区分使用接口还是抽象类最好了,比如说动物类是一个总成,下面有鸟,哺乳类,鱼,这三类都有共同的特点就是吃和睡等等,这三类和动物是属于关系(或包含和被包含的关系)用抽象类继承就好了,形象;而具体实现某类动物的某些功能的诸如鸟类的飞行,不同的鸟飞行方式不一样,它们并非前面的属于关系 ,这是实现的方式问题就用接口来实现好啦...

    不知道这样说是不是正确,但我就是这样理解和应用的,希望大家多给建议啊...

原创粉丝点击