您的位置:首页 > 编程语言 > Java开发

Java 抽象类和接口的区别

2007-11-04 04:14 429 查看
        abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义方面具有很大的相似性,甚至可以相互替换,其实,两者之间还是有很大的区别的,对于它们的选择甚至能反映出设计者对于设计领域本质的理解是否正确和合理。
 
  abstract class和interface在Java语言中都是用来进行抽象定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢? 

  在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,只是作为他的子类的基体,这样的类就是抽象类。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于多边形这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。

  在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。
 
     在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,在abstract class方式中,可以有自己的数据成员,也可以有非abstarct的成员。而在interface方式的实现中,只能够有静态的不能被修改的数据成员(也就是隐式的static final的),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。 
      从编程的角度来看,abstract class和interface都可以用来实现”design by contract”的思想。但是在具体的使用上面还是有一些区别的。首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。其次,在abstract class的定义中,我们还可以定义其它的非抽象的方法和属性,这个对于类继承相当实用。但是在interface的定义中,方法却只能都是抽象的。 

     前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在”is a”关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,实现者仅仅需要实现interface定义的标准。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息