接口和抽象类之间到底有什么区别?
当前回答
抽象类是无法创建对象的类或无法实例化的类。抽象方法使类抽象。抽象类需要被继承,以便覆盖在抽象类中声明的方法。对访问说明符没有限制。抽象类中可以有构造函数和其他具体(非abstract方法)方法,但接口不能有。
接口是方法的蓝图/模板。(例如,在纸上给出一个房子(接口房子),不同的建筑师将使用他们的想法来建造它(实现房子接口的建筑师的类别)。它是抽象方法、默认方法、静态方法、最终变量和嵌套类的集合。所有成员都将是最终成员或公共成员,不允许使用受保护和私有访问说明符。不允许创建对象。必须创建一个类,以便使用实现接口并重写接口中声明的抽象方法。接口是松散耦合(动态多态性/动态绑定)的一个很好的例子接口实现了多态性和抽象。它告诉要做什么,但如何做由实现类定义。例如,有一家汽车公司希望其制造的所有汽车的某些功能都相同,因此该公司将制造一种具有这些功能的接口车辆,而不同级别的汽车(如Maruti Suzkhi、Maruti 800)将覆盖这些功能。
当我们已经有抽象类时,为什么要接口?Java只支持多级和分层继承,但借助于接口,我们可以实现多重继承。
其他回答
其实很简单。
您可以将接口视为一个类,它只允许有抽象方法,而不允许有其他方法。
因此,接口只能“声明”而不能定义您希望类具有的行为。
抽象类允许您声明(使用抽象方法)和定义(使用完整方法实现)您希望类具有的行为。
常规类只允许您定义而不是声明您希望类具有的行为/动作。
最后一件事,
在Java中,可以实现多个接口,但只能扩展一个(抽象类或类)。。。
这意味着定义行为的继承被限制为每个类只允许一个。。。例如,如果你想要一个从类a、B和C中封装行为的类,你需要执行以下操作:类a扩展B,类C扩展a。。这是一个有点迂回的方式来拥有多重继承。。。
另一方面,您可以简单地执行接口:接口C实现A、B
因此实际上,Java只在“声明的行为”(即接口)中支持多重继承,并且只支持具有定义行为的单一继承。。除非你像我描述的那样。。。
希望这是合理的。
接口只包含功能的定义/签名,如果我们有一些公共功能和公共签名,那么我们需要使用抽象类。通过使用抽象类,我们可以同时提供行为和功能。另一个继承抽象类的开发人员可以很容易地使用这个功能,因为他们只需要填写空白。
摘自:
http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html
http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.htmlhttp://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html
代表实际实现的抽象类和接口之间的差异。
接口:它是一个关键字,用于定义对象的模板或蓝图,它强制所有子类遵循相同的原型,作为实现,所有子类都可以根据其要求自由实现功能。
我们应该使用接口的一些其他用例。
两个外部对象(应用程序中的第三方集成)之间的通信通过此处的接口完成。
抽象类:抽象,它是一个关键字,当我们在任何类之前使用这个关键字时,它就成为抽象类。它主要用于我们需要定义模板以及所有子类后面的对象的一些默认功能时,这样它就删除了多余的代码和一个可以使用抽象类的用例,例如,我们不希望其他类可以直接实例化该类的对象,只有派生类可以使用该功能。
抽象类示例:
public abstract class DesireCar
{
//It is an abstract method that defines the prototype.
public abstract void Color();
// It is a default implementation of a Wheel method as all the desire cars have the same no. of wheels.
// and hence no need to define this in all the sub classes in this way it saves the code duplicasy
public void Wheel() {
Console.WriteLine("Car has four wheel");
}
}
**Here is the sub classes:**
public class DesireCar1 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red color Desire car");
}
}
public class DesireCar2 : DesireCar
{
public override void Color()
{
Console.WriteLine("This is a red white Desire car");
}
}
接口示例:
public interface IShape
{
// Defines the prototype(template)
void Draw();
}
// All the sub classes follow the same template but implementation can be different.
public class Circle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Circle");
}
}
public class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("This is a Rectangle");
}
}
我不想强调这些差异,这已经在很多答案中说过了(关于接口中变量的公共静态最终修饰符以及抽象类中受保护的私有方法的支持)
简单地说,我想说:
接口:通过多个不相关的对象实现合同
抽象类:在多个相关对象之间实现相同或不同的行为
来自Oracle文档
如果出现以下情况,请考虑使用抽象类:
您希望在几个密切相关的类之间共享代码。您希望扩展抽象类的类具有许多公共方法或字段,或者需要公共以外的访问修饰符(如protected和private)。您要声明非静态或非final字段。
如果出现以下情况,请考虑使用接口:
您希望不相关的类实现您的接口。例如,许多不相关的对象可以实现Serializable接口。您希望指定特定数据类型的行为,但不关心谁实现了它的行为。您希望利用类型的多重继承。
抽象类与具体类建立“是”关系。接口为类提供了“具有”功能。
如果您正在寻找Java作为编程语言,这里还有一些更新:
Java8通过提供默认方法特性,在一定程度上缩小了接口类和抽象类之间的差距。接口没有实现。方法现在不再有效。
有关详细信息,请参阅本文档页。
看看这个SE问题,了解代码示例,以便更好地理解。
我应该如何解释接口和抽象类之间的区别?
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”。?>如果您正在分发一个类供其他人使用,那么您的类将实现一个特定的接口。接口是一个协议,为您的类提供一组特定的公共方法。如果您(或其他人)编写了一个已经编写了一些要在新类中使用的方法的类,则可以让您的类扩展一个抽象类。这些概念虽然很容易混淆,但却特别不同和不同。出于所有意图和目的,如果您是任何类的唯一用户,则不需要实现接口。
推荐文章
- 如何在方法中访问“静态”类变量?
- 为什么c#不提供c++风格的'friend'关键字?
- String, StringBuffer和StringBuilder
- 如何在python抽象类中创建抽象属性?
- 存储库和服务层的区别?
- DDD -实体不能直接访问存储库的规则
- 为什么STL如此严重地基于模板而不是继承?
- 如何在Objective-C中声明类级属性?
- 面向方面编程与面向对象编程
- c++中类似于java的instanceof
- 在python中遍历对象属性
- 将类代码分离为头文件和cpp文件
- 在PHP中使用getter和setter而不是函数或简单的公共字段有什么优点?
- 基于原型的继承与基于类的继承
- 如何在Java中找到给定类的所有子类?