Java抽象类和接口的区别

来源:互联网 发布:没有系统的嵌入式编程 编辑:程序博客网 时间:2024/05/01 00:55

 

  abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。

  在面向对象的概念中,所有的对象都是通过类来描绘的,但是并不是所有的类都能来描绘对象。如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。抽象类只是一个抽象得概念,在问题领域中没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。 

  在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类

 

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

 

使用abstract class的方式定义Demo抽象类的方式如下:  

abstract class Demo {  

 abstract void method1();  

 abstract void method2();  

 …  

}  

 

使用interface的方式定义Demo抽象类的方式如下:  

interface Demo {  

 void method1();  

 void method2();  

 …  

}  

 

  在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法。而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。

  首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

  其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为

 

从设计理念层面看abstract class和interface

 

  abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已,interface表示的是"like a"关系。

 

原创粉丝点击