Java中抽象类和接口的区别与联系

龙源期刊网 http://www.qikan.com.cn

Java中抽象类和接口的区别与联系

作者:颜瑞江

来源:《硅谷》2011年第03期

摘要: 首先对类、抽象类进行简要介绍,并对抽象类和接口的有关情况进行详细说明,然后对抽象类与接口的区别和联系进行比较和分析,最后对有关内容进行总结。 关键词: Java;抽象类;接口

中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2011)0210023-01 0 引言

在那些面向对象(object)的程序设计语言的概念中,类(class)指的是一种抽象的数据类型、是客观对象在人脑中的主观反映、是对象共性的抽象、类型相同事物数据的抽象。可以说,全部的对象都需要通过类来进行描述,但是全部的类却不一定都是用来对对象来进行描述的。如果某一个类中所包含的信息不足以用来描述一个具体的对象,那么我们就称其为抽象类(abstract class)。

抽象类是我们在对某一问题领域进行设计和分析时所得出的抽象概念,是一系列本质上相同,而外在形象各异的具体概念的抽象反映。在面向对象领域中,抽象类的主要作用就是进行类型隐藏,是实现向对象设计的核心原则OCP(Open-Closed Principle)的关键。 1 抽象类的有关概念

通过abstract来完成的类就被称作为抽象类,最终通过子类来实现。如果说抽象类是一张设计图纸的话,那么子类就是根据这张设计图纸所生产出来的产品。总的来说,抽象类主要有以下几方面特点:

1)抽象类不能创建对象。

2)抽象类可以调用静态方法,同时不能对非静态方法进行调用。 3)抽象类可以对一个引用进行声明。

4)一个抽象类可以被子类继承,继承它的子类也可以是抽象类。 5)抽象类与多态性是密不可分的。

龙源期刊网 http://www.qikan.com.cn

6)如果一个类用到了抽象方法,那么这个类必须是抽象类。但是一个抽象类中却不一定要有抽象方法。

抽象类是Java中最为常用的语法之一,在开发过程中,它的主要作用就是抽象出某些子类的共性,由于在抽象类中仅对方法的作用进行说明,因此在使用不同的子类时,实现的方法是不一样的,这就是方法实现的个性。抽象类中不一定要有抽象方法,但是大多数抽象类都含有可以让子类集成的抽象方法,如果在继承过程中,子类没有将抽象类中全部的抽象方法重写,那么这个子类就会变为抽象类;如果子类完成了全部抽象方法的重写,那么就可以完成自身的实例化。

在日常生活中,事物的功能都是确定的,因此现实中的类大多属于抽象类,只不过它的实现是基本都是通过子类来完成。因此,抽象类不能独立存在,但如果在创建子类时,先完成父类的构建也是可行的。可以说,抽象类就是一个标准,其作用在于对某类事物的方法进行定义,使其可以被不同的子类继承和实现。所以,对于调用者来说,只需要了解抽象类的方法定义就可以实现对不同子类的调用。 2 接口的有关概念

接口(inter faces)指的是Java中的一系列方法的声明,它包含了方法的特征,但是不包括对这种方法的实现,其原因就在于这些方法可以在不同的地方由不同的类实现,从而具备不同的功能。通过接口,我们可以实现多继承,但这也只是接口众多功能中的一个。由于接口属于类的附加信息,因此这种多继承功能并不会对类的单继承造成任何影响。接口是对事物共性进行再一次抽象的过程,任何对象都不可能是单个类型的,但是对象的多类型却存在着一个主次关系,其中,主要的做成类包括输入和存储设备,次要的就做成接口,包括usb设备等。 接口为我们提供了一个标准,让方法的使用和实现者之间能够形成一种弱耦合关系,由于接口中所包含的都是抽象方法,因此从本质上来看,接口就是一种解耦合工具。当若干个父接口同时指向某一个实现类的对象时,那么它们所能够调用的就是该接口正在引用的方法。 总的来说,接口主要有如下特征: 1)接口实际上也属于抽象类的范畴。

2)接口同样可以被继承,当它被一个类继承时,需要使用implements;当它被接口继承时,子接口会被归入抽象类的范畴,不需要实现。另外,接口也可以实现多继承。 3)在一个接口文件中,只能存在一个公开的接口。 3 抽象类与接口的区别和联系

龙源期刊网 http://www.qikan.com.cn

通过上面的介绍我们可以知道,抽象类和接口在Java语言中属于两种不同的、但是都支持类定义的机制,它们的存在使Java具备了强大的功能。抽象类和接口在支持抽象类的定义方面具有较高的相似性,在有些情况下甚至是可以相互代替的;但是接口的作用确实用来实现多继承,一个类只可以有一个父类,但是却可以对应多个接口,由于接口不涉及实现,因此它所描述的只是公共行为。从这点上看,接口在抽象化程度方面比抽象类的更高。接口中所包含的方法可以是公开和抽象的,但是它不能有构造器,只能包含final属性、静态和public。 接口将方法的特征和实现分割开来,这种分割使接口具有了相关的操作和属性,最终通过类来对其进行实现。一个接口的实现类是可以多种多样的,除了要求类具有实现该接口的功能外,这种实现并不会对类提出更多的要求。接口提供了方法调用以及关联上的可插入性,软件系统的生命周期越长、规模越大,接口提供的可扩展性和灵活性也就越多,使可插入性得到更多的保证。 4 结语

综上所述,抽象类和接口是Java语言中两种对抽象类进行定义的方式,它们之间具有较强的相似性,但是由于所表达概念关系的不同,因此在对它们进行具体选择时,往往会反映出对于问题领域中的概念、本质、设计意图的理解和反映是否准确,抽象类在Java语言中所表达的是一种继承关系,一个类只能使用一次继承关系,但是却能够对应多个接口。在抽象类中,抽象与非抽象可以共存,而在接口中,数据成员却只能是static final的,并且其方法也必须是抽象的。抽象类所表示的是“is-a”的关系,接口所表示的是“like-a”的关系,这种差异是不同设计理念的真实反映。对抽象类和接口进行实现的类必须要能够实现其中全部的方法。 接口中定义变量,默认为public static final型,并且必须赋予其初值,因此在实现类中无法对其进行重新定义,也不能对其值进行改变。而抽象类中的定义变量,默认为friendly型,不仅可以在子类中对其值进行重新定义,可以刻对其重新进行赋值。接口中的方法均默认为public,abstract类型。

参考文献:

[1]李刚,疯狂Java讲义[M].北京:电子工业出版社,2008,10.

[2]阳小兰,Java中抽象类和接口的使用研究[J].软件导刊,2010(10): 56-58.

[3]纪娜、李静、黄婉林,Java中抽象类和接口的比较[J].杨凌职业技术学院学报,2008(1):43-46.

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4