【发布时间】:2014-06-27 06:23:25
【问题描述】:
我已经阅读了很多抽象类和接口的例子,但我没有得到这样做的用途,因为两者都在做同样的工作。谁能给我一个简单的例子来弄清楚这个谜题
【问题讨论】:
标签: java interface abstract-class
我已经阅读了很多抽象类和接口的例子,但我没有得到这样做的用途,因为两者都在做同样的工作。谁能给我一个简单的例子来弄清楚这个谜题
【问题讨论】:
标签: java interface abstract-class
首先,修改BASIC DIFFERENCES:-
Java 接口中声明的变量默认为 final。抽象类可能包含非最终变量。
Java 接口的成员默认是公共的。 Java 抽象类可以具有通常的类成员风格,例如私有、受保护等。
Java 接口应该使用关键字“implements”来实现;应使用关键字“extends”扩展 Java 抽象类。
一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。
一个 Java 类可以实现多个接口,但它只能扩展一个抽象类。 接口是绝对抽象的,不能实例化; Java 抽象类也不能被实例化,但可以在 main() 存在时调用。
与 java 抽象类相比,java 接口很慢,因为它需要额外的间接。
如果这些陈述中的任何一个适用于 你的情况:
您希望在几个密切相关的类之间共享代码。 您希望扩展抽象类的类具有许多公共方法或字段,或者需要公共以外的访问修饰符(例如受保护和私有)。
您要声明非静态或非最终字段。这使您能够定义可以访问和修改它们所属对象的状态的方法。
如果这些陈述中的任何一个适用于您的 情况:
您希望不相关的类会实现您的接口。例如,接口 Comparable 和 Cloneable 由许多不相关的类实现。
您想指定特定数据类型的行为,但不关心谁实现了它的行为。
您想利用类型的多重继承。
(取自 Oracle 官方教程)。
【讨论】:
default 关键字实现方法。另外,看看我链接的问题。似乎第 6 点不再正确。
关于何时使用接口和抽象类的一个简单答案是: 当您知道不必修改接口时使用接口,即添加/删除/修改方法,因为如果您更改接口的实现,则必须在该特定接口所在的所有类中执行相同操作实施。
另一方面,如果您知道随着时间的推移可能会添加/删除/修改方法,则应该使用抽象类。因此,如果您必须添加一个方法,您可以将其添加到抽象类中,而无需将其声明为抽象方法。
我在某处读到过这篇文章,但现在找不到参考资料...
希望这会有所帮助..
【讨论】:
有一次我偶然发现了一篇非常好的文章,它描述了:
功能
多重继承
区别
一个类可以继承多个接口。
一个类只能继承一个抽象类。
功能
默认实现
区别
接口不能提供任何代码,只能提供签名。
抽象类可以提供完整的默认代码和/或仅提供必须覆盖的细节。
功能
访问修饰符
区别
接口不能有子、函数、属性等的访问修饰符,一切都被假定为公共
抽象类可以包含子类、函数、属性的访问修饰符
功能
核心 VS 外设
区别
接口用于定义类的外围能力。换句话说,Human 和 Vehicle 都可以从 IMovable 接口继承。
抽象类定义了一个类的核心标识,并用于相同类型的对象。
功能
同质性
区别
如果各种实现只共享方法签名,那么最好使用接口。
如果各种实现是同类并使用共同的行为或状态,那么最好使用抽象类。
功能
速度
区别
接口需要更多时间才能在对应的类中找到实际的方法。
虽然抽象类做得很快
功能
添加功能(版本控制)
区别
如果我们向接口添加新方法,那么我们必须跟踪接口的所有实现并为新方法定义实现。
如果我们向抽象类添加新方法,那么我们可以选择提供默认实现,因此所有现有代码都可以正常工作。
功能
字段和常量
区别
接口中不能定义字段
抽象类可以定义字段和常量
您可以refer this了解更多信息
【讨论】: