接口和抽象类之间到底有什么区别?
当前回答
我想再加一个有意义的区别。例如,您有一个包含数千行代码的框架。现在,如果您想使用方法enhanceUI()在整个代码中添加新特性,那么最好在抽象类中添加该方法,而不是在接口中添加。因为,如果在接口中添加此方法,那么应该在所有已实现的类中实现它,但如果在抽象类中添加方法则不是这样。
其他回答
其实很简单。
您可以将接口视为一个类,它只允许有抽象方法,而不允许有其他方法。
因此,接口只能“声明”而不能定义您希望类具有的行为。
抽象类允许您声明(使用抽象方法)和定义(使用完整方法实现)您希望类具有的行为。
常规类只允许您定义而不是声明您希望类具有的行为/动作。
最后一件事,
在Java中,可以实现多个接口,但只能扩展一个(抽象类或类)。。。
这意味着定义行为的继承被限制为每个类只允许一个。。。例如,如果你想要一个从类a、B和C中封装行为的类,你需要执行以下操作:类a扩展B,类C扩展a。。这是一个有点迂回的方式来拥有多重继承。。。
另一方面,您可以简单地执行接口:接口C实现A、B
因此实际上,Java只在“声明的行为”(即接口)中支持多重继承,并且只支持具有定义行为的单一继承。。除非你像我描述的那样。。。
希望这是合理的。
一些重要的区别:
以表格的形式:
正如Joe在javapapers中所说:
1.主要区别在于Java接口的方法是隐式抽象的,不能有实现。Java抽象类可以具有实现默认行为的实例方法。2.Java接口中声明的变量默认为final。抽象类可以包含非最终变量。3.默认情况下,Java接口的成员是公共的。Java抽象类可以具有类成员的通常风格,受保护等。。4.Java接口应使用关键字“implements”实现;Java抽象类应该使用关键字“extends”进行扩展。5.接口只能扩展另一个Java接口,抽象类可以扩展另一Java类并实现多个Java接口。6.Java类可以实现多个接口,但只能扩展一个抽象类。7.接口是绝对抽象的,不能实例化;Java抽象类也不能实例化,但如果main()存在。8.与java抽象类相比,java接口速度较慢,因为它需要额外的间接寻址。
为了给出一个简单但明确的答案,设置上下文是有帮助的:当您不想提供完整的实现时,可以同时使用这两种方法。
因此,主要的区别是接口根本没有实现(只有没有主体的方法),而抽象类也可以有具有主体的成员和方法,即可以部分实现。
php.net上抽象类和接口的简单而有效的解释:
接口就像一个协议。它不指定对象的行为;它指定代码如何告诉该对象的动作。接口类似于英语:定义接口定义代码如何与实现该接口的任何对象通信。接口始终是一个协议或承诺。当一个类说“我实现接口Y”时,它就是说“我承诺拥有与任何具有接口Y的对象相同的公共方法”。另一方面,抽象类类似于部分构建的类。它很像是一个有空格要填写的文档。它可能使用英语,但这并不像某些文档已经写好这样重要。抽象类是另一个对象的基础。当一个类显示“I extend abstract class Y”时,它表示“I use some methods or properties already defined in this other class named Y”。因此,请考虑以下PHP:<?php文件类X实现了Y{}//这意味着“X”同意使用代码使用语言“Y”。类X扩展了Y{}//这意味着“X”将完成部分类“Y”。?>如果您正在分发一个类供其他人使用,那么您的类将实现一个特定的接口。接口是一个协议,为您的类提供一组特定的公共方法。如果您(或其他人)编写了一个已经编写了一些要在新类中使用的方法的类,则可以让您的类扩展一个抽象类。这些概念虽然很容易混淆,但却特别不同和不同。出于所有意图和目的,如果您是任何类的唯一用户,则不需要实现接口。
我们在接口和抽象类之间存在各种结构/语法差异。还有一些不同之处
[1] 基于场景的差异:
当我们希望限制用户创建父类的对象时,抽象类被用于场景中,并且我们相信将来还会添加更多的抽象方法。
当我们确信不能提供更多抽象方法时,必须使用接口。然后只发布一个接口。
[2] 概念差异:
“我们是否需要在未来提供更多抽象方法”,如果是,则将其设为抽象类,如果否,则设为接口。
(在java 1.7之前最合适和有效)