我已经通过了很多关于抽象类和接口的例子,但是我没有使用这样做,因为两者都做同样的工作。任何人都可以给我一个简单的例子来弄清楚这个谜语
答案 0 :(得分:2)
首先, BASIC DIFFFERENCES 的修订: -
Java接口中声明的变量默认为final。抽象类可能包含非最终变量。
默认情况下,Java接口的成员是公共的。 Java抽象类可以具有通常的类成员类型,如private,protected等。
Java接口应该使用关键字“implements”来实现;应使用关键字“extends”扩展Java抽象类。
接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口。
Java类可以实现多个接口,但它只能扩展一个抽象类。 接口绝对是抽象的,无法实例化; Java抽象类也无法实例化,但如果存在main(),则可以调用它。
与java抽象类相比,java接口很慢,因为它需要额外的间接。
如果任何这些语句适用,请考虑使用抽象类 你的情况:
您希望在几个密切相关的类之间共享代码。 您希望扩展抽象类的类具有许多常用方法或字段,或者需要除公共之外的访问修饰符(例如protected和private)。
您想要声明非静态或非最终字段。这使您可以定义可以访问和修改它们所属对象状态的方法。
如果这些陈述中的任何一个适用于您的,请考虑使用接口 情况:
您希望不相关的类能够实现您的界面。例如,Comparable和Cloneable接口由许多不相关的类实现。
您希望指定特定数据类型的行为,但不关心谁实现其行为。
您希望利用类型的多重继承。
(摘自Oracle的官方教程)。
答案 1 :(得分:1)
关于何时使用接口和抽象类的一个简单答案是: 当您知道不必修改界面时使用Interface,即添加/删除/修改方法,因为如果更改了界面的实现,则必须在此特定界面的所有类中执行相同操作正在实施。
另一方面,如果您知道有可能添加/删除/修改方法,则应使用抽象类。因此,如果必须添加方法,可以将其添加到抽象类中,而不将其声明为抽象方法。
我在某个地方读过这篇文章,但现在找不到参考资料......
希望这会有所帮助..
答案 2 :(得分:0)
有一次我偶然发现了一篇非常好的文章,其中描述了:
<强>功能强>
多重继承
<强>差分强>
一个类可以继承几个接口。
一个类只能继承一个抽象类。
<强>功能强>
默认实施
<强>差分强>
接口不能提供任何代码,只能提供签名。
抽象类可以提供完整的默认代码和/或只需要覆盖的详细信息。
<强>功能强>
访问修改程序
<强>差分强>
接口不能具有子,函数,属性等的访问修饰符,一切都假定为公共
抽象类可以包含subs,functions,properties
<强>功能强>
核心VS外围设备
<强>差分强>
接口用于定义类的外围功能。换句话说,Human和Vehicle都可以从IMovable接口继承。
抽象类定义类的核心标识,并在那里用于相同类型的对象。
<强>功能强>
同质
<强>差分强>
如果各种实现只共享方法签名,那么最好使用Interfaces。
如果各种实现属于同一类并且使用共同的行为或状态,则最好使用抽象类。
<强>功能强>
速度
<强>差分强>
接口需要更多时间在相应的类中查找实际方法。
虽然抽象类可以快速完成
<强>功能强>
添加功能(版本控制)
<强>差分强>
如果我们向接口添加一个新方法,那么我们必须跟踪接口的所有实现并定义新方法的实现。
如果我们向抽象类添加一个新方法,那么我们可以选择提供默认实现,因此所有现有代码都可以正常工作。
<强>功能强>
字段和常量
<强>差分强>
接口中无法定义任何字段 抽象类可以定义字段和约束
您可以refer this了解更多信息