在java中精确使用抽象类和接口

时间:2014-06-27 06:23:26

标签: java interface abstract-class

我已经通过了很多关于抽象类和接口的例子,但是我没有使用这样做,因为两者都做同样的工作。任何人都可以给我一个简单的例子来弄清楚这个谜语

3 个答案:

答案 0 :(得分:2)

首先, BASIC DIFFFERENCES 的修订: -

  1. Java接口中声明的变量默认为final。抽象类可能包含非最终变量。

  2. 默认情况下,Java接口的成员是公共的。 Java抽象类可以具有通常的类成员类型,如private,protected等。

  3. Java接口应该使用关键字“implements”来实现;应使用关键字“extends”扩展Java抽象类。

  4. 接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口。

  5. Java类可以实现多个接口,但它只能扩展一个抽象类。 接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果存在main(),则可以调用它。

  6. 与java抽象类相比,java接口很慢,因为它需要额外的间接。

  7.   

    如果任何这些语句适用,请考虑使用抽象类   你的情况:

    您希望在几个密切相关的类之间共享代码。 您希望扩展抽象类的类具有许多常用方法或字段,或者需要除公共之外的访问修饰符(例如protected和private)。

    您想要声明非静态或非最终字段。这使您可以定义可以访问和修改它们所属对象状态的方法。

      

    如果这些陈述中的任何一个适用于您的,请考虑使用接口   情况:

    您希望不相关的类能够实现您的界面。例如,Comparable和Cloneable接口由许多不相关的类实现。

    您希望指定特定数据类型的行为,但不关心谁实现其行为。

    您希望利用类型的多重继承。

    (摘自Oracle的官方教程)。

答案 1 :(得分:1)

关于何时使用接口和抽象类的一个简单答案是: 当您知道不必修改界面时使用Interface,即添加/删除/修改方法,因为如果更改了界面的实现,则必须在此特定界面的所有类中执行相同操作正在实施。

另一方面,如果您知道有可能添加/删除/修改方法,则应使用抽象类。因此,如果必须添加方法,可以将其添加到抽象类中,而不将其声明为抽象方法。

我在某个地方读过这篇文章,但现在找不到参考资料......

希望这会有所帮助..

答案 2 :(得分:0)

有一次我偶然发现了一篇非常好的文章,其中描述了:

<强>功能

多重继承

<强>差分

一个类可以继承几个接口。

一个类只能继承一个抽象类。

<强>功能

默认实施

<强>差分

接口不能提供任何代码,只能提供签名。

抽象类可以提供完整的默认代码和/或只需要覆盖的详细信息。

<强>功能

访问修改程序

<强>差分

接口不能具有子,函数,属性等的访问修饰符,一切都假定为公共
抽象类可以包含subs,functions,properties

的访问修饰符

<强>功能

核心VS外围设备

<强>差分

接口用于定义类的外围功能。换句话说,Human和Vehicle都可以从IMovable接口继承。

抽象类定义类的核心标识,并在那里用于相同类型的对象。

<强>功能

同质

<强>差分

如果各种实现只共享方法签名,那么最好使用Interfaces。

如果各种实现属于同一类并且使用共同的行为或状态,则最好使用抽象类。

<强>功能

速度

<强>差分

接口需要更多时间在相应的类中查找实际方法。

虽然抽象类可以快速完成

<强>功能

添加功能(版本控制)

<强>差分

如果我们向接口添加一个新方法,那么我们必须跟踪接口的所有实现并定义新方法的实现。

如果我们向抽象类添加一个新方法,那么我们可以选择提供默认实现,因此所有现有代码都可以正常工作。

<强>功能

字段和常量

<强>差分

接口中无法定义任何字段 抽象类可以定义字段和约束

您可以refer this了解更多信息