background image

abstract class 和 interface 是 Java 语言中对于抽象类定义进行支持的两种机制,正是由于这
两种机制的存在,才赋予了 Java 强大的面向对象能力。abstract class 和 interface 之间在对
于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进
行抽象类定义时对于 abstract class 和 interface 的选择显得比较随意。其实,两者之间还是
有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的
理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在
二者之间进行选择的依据。

抽象类包含未被实现的方法,继承抽象类时必须把那些方法实现,而普通

类的方法都已经实现,继承时比较自由。

抽象类的特点:
1

 

、抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽

然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或

 

者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生

   

的)。
2

   

、允许(但不要求)抽象类包含抽象成员。 3

   

、抽象类不能被密封。 当从抽

象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,

   

从而重写哪些抽象成员。在下边的示例中: abstract class A{ public abstract 
void F();}   abstract class B: A{ public void G() {}}   class C: B{ public override 
void F() { // actual implementation of F }}    

 

抽象类 A 

 

引入抽象方法 F

 

。类 B 引

 

入另一个方法 G

 

,但由于它不提供 F 的实现,B 

 

也必须声明为抽象类。类 C 

 

重写 F

 

,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非

 

必须)将 C 声明为非抽象类。

方法重载是指同一类中方法名相同,返回值或者参数列表不同的一系列方

法;而方法重写指的是子类实现抽象类的方法。

 

  理解抽象类

  在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不
是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘
一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、
设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比
如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一
些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问
题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具

 

体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

 

  下面从三个方面进行比较:

  一、从语法定义层面看 abstract class 和 interface 

  在语法层面,Java 语言对于 abstract class 和 interface 给出了不同的定义方式,下面以
定义一个名为 Demo

 

的抽象类为例来说明这种不同。