抽象和接口

原创 2015年11月21日 19:35:58

抽象类特征:

1.抽象类和抽象方法都必须用abstract关键字来修饰。

2.抽象类不能被实例化,也就是不能用new关键字去产生对象。

3.抽象方法只需声明,而无需实现.

4.抽象方法必须定义在抽象类中,抽象类的子类必须实现父类中的抽象方法,否则这个子类还是个抽象类。

 

接口的特征如下:

1.接口没有构造方法。

2.接口中声明变量均为终极(final)的静态(static)的和公共(public)的。

3.接口中定义的方法均为抽象的和公共的。

4.接口里的数据成员必须初始化,且数据成员均为常量。

 

     声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于创建一个体现某些基本行为的类,并为该类声明方法,但不能实现类中的方法。不能创建abstract类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。

  

    接口(interface)是抽象类的变体,在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中所有方法都是抽象的,没有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。

 

形象来说,抽象类是这个东西是什么,而接口是这个东西能干什么


 一、抽象类:

         抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

 二、接口:

        接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式,就如面向对象抽象技术提供的多重抽象化。接口可能也提供某种意义上的在讲不同语言的实体之间的翻译,诸如人类与电脑之间。因为接口是一种间接手段,所以相比起直接沟通,会引致些额外负担。

 三、抽象类和接口的相似之处有三点:

  1、不能实例化;

  2、包含未实现的方法声明  

  3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);   

    另外,接口有如下特性: 接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

四、抽象类和接口的区别:

        从实质上讲抽象类表示的是这个对象是什么。接口表示的是这个对象能做什么。

        比如男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明他们都是人。

                   人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它

        接下来通过一张表来分析接口和抽象类的不同。

  



以下是从百度中搜到的:

 

      Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。

  Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现。OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程,正确地使用接口、抽象类这些太有用的抽象类型做为你结构层次上的顶层。

  Java接口和Java抽象类有太多相似的地方,又有太多特别的地方,究竟在什么地方,才是它们的最佳位置呢?把它们比较一下,你就可以发现了。

  1、Java接口和Java抽象类最大的一个区别,就在于Java抽象类可以提供某些方法的部分实现,而Java接口不可以,这大概就是Java抽象类唯一的优点吧,但这个优点非常有用。如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。

  2、一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的等级结构中,而由于Java语言的单继承性,所以抽象类作为类型定义工具的效能大打折扣。在这一点上,Java接口的优势就出来了,任何一个实现了一个Java接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个Java接口,从而这个类就有了多种类型。

  3、从第2点不难看出,Java接口是定义混合类型的理想工具,混合类表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为。Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。


在面向对象领域,抽象类主要用来进行类型隐藏 。 我们可以构造出一个固定的一组行为的抽象描 述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个 抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP 的读者一定知 道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle) ,抽象类是其中的关键所在。

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

从编程的角度来看,abstract class和interface都可以用来实现 "design by contract" 的思想。但是在具体的使用上面还是有一些区别的。

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

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

在 抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因 为如果后来想修改类的界面(一般通过 abstract class 或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添 加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那 么可能就只需要修改定义在abstract class中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了 "one rule,one place" 原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。


版权声明:本文为博主原创文章,未经博主允许不得转载。

抽象类与接口的区别

  abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和in...
  • ttgjz
  • ttgjz
  • 2008年09月22日 11:28
  • 27444

java提高篇(四)-----抽象类与接口

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。        抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两...
  • chenssy
  • chenssy
  • 2013年10月18日 21:04
  • 135263

抽象类和接口的区别以及使用场景(记)

抽象类和接口的区别以及使用场景(记)抽象类和接口的区别以及使用场景记 相同点 不同点 interface的应用场合 abstract class的应用场合1. 相同点 两者都是抽象类,都不能实例化。 ...

PHP中抽象类和接口的区别

PHP中抽象类和接口的区别一、让我们看看这两者的定义 接口:1)使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。2)接口是通过 interface 关...

抽象类和接口的区别

  • 2014年04月23日 19:24
  • 3KB
  • 下载

面试题_抽象类和接口的区别

含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类必须定义为abstract class ,abstract class 里的方法不...

关于接口和抽象类的案例

  • 2014年08月25日 21:28
  • 619B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:抽象和接口
举报原因:
原因补充:

(最多只允许输入30个字)