`
Riancy007
  • 浏览: 118851 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

抽象类和接口之大对比

阅读更多
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意图的理解是否正确、合理。



理解抽象类


abstract class和interface在Java语言中都是用来进行抽象类定义的。什么是抽象类呢?在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。


在面向对象领域中,抽象类主要是用来进行类型隐藏的。我们可以构造出一个固定的一组行为的描述,但是这些被描述的行为的实现方式是多种多样的,这组抽象描述就是抽象类,而任意一个抽象描述的实现则是它的派生类,派生类不仅可以实现那些描述,也可以扩展其功能(OCP)。



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

在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。

  使用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和interface都可以用来实现 "design by contract" 的思想。但是在具体的使用上面还是有一些区别的。

 首先,abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。

  其次,在abstract class的定义中,我们可以赋予方法的默认行为(非抽象方法)。但是在interface的定义中,方法却不能拥有默认行为(非抽象方法),为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。


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

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得 继承关系合理,父类和派生类之间必须存在"isa"关系,即父类和派生类在概念本质上应该是相同的
对于interface来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的, 仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。


考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstractclass或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:

  使用abstract class方式定义Door:

  abstract class Door{

  abstract void open();

  abstract void close();

  }

  使用interface方式定义Door:

  interface Door{

  void open();

  void close();

  }

  其他具体的Door类型可以extends使用abstractclass方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstractclass和interface没有大的区别。

  如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢(在本例中, 主要是为了展示abstractclass和interface反映在设计理念上的区别,其他方面无关的问题都做了简化或者忽略)?下面将罗列出可能的解 决方案,并从设计理念层面对这些不同的方案进行分析。

  解决方案一:

  简单的在Door的定义中增加一个alarm方法,如下:

  abstract class Door{

  abstract void open();

  abstract void close();

  abstract void alarm();

  }

  或者

  interface Door{

  void open();

  void close();

  void alarm();

  }

  那么具有报警功能的AlarmDoor的定义方式如下:

  class AlarmDoor extends Door{

  void open(){…}

  void close(){…}

  void alarm(){…}

  }

  或者

  class AlarmDoor implements Door{

  void open(){…}

  void close(){…}

  void alarm(){…}

  }

  这种方法违反了面向对象设计中的一个核心原则ISP (InterfaceSegregationPriciple),在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方 法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变(比如:修改alarm方法的参数)而改变,反 之依然。

意思就是说Door这个类本身并不一定具有报警功能,只不过在这里需要报警功能。那么在以后其他的类来继承这个Door类的时候就自动有了报警功能,这是不科学的。
而接口就可以。















分享到:
评论
1 楼 kanokano 2007-10-26  
收藏!!!!

相关推荐

    抽象类和接口 区别分析

    ### 抽象类和接口的区别分析 在面向对象编程中,抽象类与接口都是实现代码复用和提高软件模块化的重要工具。它们各自拥有独特的特性和应用场景,掌握这些概念对于编写高质量、可维护性强的代码至关重要。下面我们将...

    教学视频-抽象类&接口

    5. **接口与抽象类的区别**:对比两者在使用上的差异,包括继承的数量限制(一个类只能继承一个抽象类,但可以实现多个接口)和成员类型(抽象类可有实例变量,接口则没有)。 6. **适配器模式**:可能会介绍如何...

    抽象类和接口的详细区别和联系

    在面向对象编程中,抽象类与接口是两种非常重要的概念,它们都是实现多态性的方式之一,但在使用场景、语法特性和设计哲学等方面存在明显的不同。本篇文章将深入探讨这两者的区别与联系,并通过具体的示例来帮助读者...

    Java继承_抽象类与接口的应用.

    1.继承及继承实例 2.方法重写(Overwrite) 3.super关键字 4.方法重载(Overload) 5.final修饰符 6.abstract修饰符 7.抽象类 8.接口 9.接口和抽象类对比 10.接口和抽象类使用场合实例 11.总结

    抽象类与接口的区别

    #### 三、抽象类与接口的应用场景对比 1. **多重继承**: - **抽象类**:不支持多重继承,一个子类只能继承一个抽象类。 - **接口**:支持多重继承,一个类可以实现多个接口。 2. **方法的实现**: - **抽象类*...

    抽象类和接口的区别

    #### 三、抽象类与接口的对比 **继承与实现:** 抽象类支持单继承,而接口支持多实现。这意味着一个类可以从一个抽象类继承,同时实现多个接口,增强了类的复用性和灵活性。 **代码实现:** 在抽象类中,可以提供...

    关于抽象类和接口的两篇不错文章

    ### 关于抽象类和接口的两篇不错文章 #### 一、理解抽象类与接口的基础概念 在面向对象编程中,抽象类与接口是两个重要的概念,它们在Java语言中有着特殊的实现方式。抽象类(Abstract Class)和接口(Interface)...

    Java笔记抽象类和接口

    本文将深入探讨Java中的抽象类和接口,通过对比分析帮助读者更好地理解这两种概念的区别与联系。 #### 二、抽象类 ##### 2.1 定义与特性 - **定义**:抽象类是一种特殊的类,它不能被实例化。也就是说,我们不能...

    抽象类与接口的练习

    在编程世界中,Java、C#等面向对象的语言中,抽象类和接口是两种重要的设计模式,它们都用于实现多态性,但各有其特点和使用场景。本练习旨在帮助开发者深入理解这两种概念,通过实践巩固理论知识。 首先,我们来...

    详细解析抽象类和接口的区别

    在深入探讨抽象类和接口的区别之前,我们先明确两者的定义和作用。抽象类和接口是面向对象编程中实现多态性的两种关键机制,尤其在Java这样的语言中扮演着核心角色。它们允许开发者定义行为规范,而不指定具体的实现...

    接口和抽象类

    接口和抽象类的各自讲解,以及其区别。包含c#和java中的接口和抽象类的对比。

    浅析Java抽象类与接口的区别.pdf

    现在,我们通过具体的例子来对比抽象类和接口的区别。例如,定义了一个抽象类Animal,它包含抽象方法eat()和run(),以及具体的实现方法Name()。 ```java public abstract class Animal { public void eat() { // ...

    Java抽象类与接口课程案例的教学设计.pdf

    4. **比较与区别**:对比抽象类和接口的异同,比如抽象类可以有构造方法和非抽象方法,而接口不能;一个类只能继承一个抽象类,但可以实现多个接口。 5. **教学模式**:结合线上线下的混合式教学和问题导向学习...

    Java抽象类与接口的区分_.docx

    对比抽象类和接口,我们可以总结以下几点: 1. **默认实现**:抽象类可以提供方法的默认实现,而接口原本不允许,但Java 8引入了默认方法,允许接口提供默认的实现。这样,实现接口的类可以选择使用接口提供的默认...

    接口和抽象类的比较.pdf

    在软件工程领域中,接口和抽象类是面向对象编程的两个重要概念。它们都用于实现代码的抽象化和模块化,但具体实现和使用场景上有显著差异。通过对比可以更清晰地理解它们各自的用途和特点。 首先,从概念上讲,接口...

    Java中抽象类的学习总结

    ### Java中抽象类的学习总结 ...同时,通过对比接口和抽象类的不同之处,我们可以更加灵活地选择合适的抽象机制来满足不同的需求。在实际开发中,合理利用抽象类和接口能够使程序设计更加优雅高效。

    面向对象程序设计(Java)-实验三:抽象类、接口与多态性的应用及扩展相关项目资源

    最后,对比分析了抽象类与接口之间的异同,特别是在多态性实现方面的差异。 适合人群:具备一定Java语言基础的学习者或开发者,尤其是正在学习或研究面向对象程序设计理念的人群。 使用场景及目标:此实验可以帮助...

    面向对象程序设计(Java)-实验三:抽象类、接口与多态性的应用及扩展

    最后,对比分析了抽象类与接口之间的异同,特别是在多态性实现方面的差异。 适合人群:具备一定Java语言基础的学习者或开发者,尤其是正在学习或研究面向对象程序设计理念的人群。 使用场景及目标:此实验可以帮助...

    接口和抽象类的区别_--相信你看完不会再混淆了

    #### 抽象类与接口的对比 尽管抽象类和接口都可以用于定义类的公共行为,但它们之间存在一些重要的区别: 1. **实现约束**: - **接口**:可以被多个类实现,这支持了多继承的概念。 - **抽象类**:只能被单个类...

Global site tag (gtag.js) - Google Analytics