抽象类与接口:异同
已发表: 2021-06-02如果您正在参加软件工程面试,您可能会遇到的一个问题是 – 抽象类和接口之间的差异和相似之处。
抽象类和接口是面向对象编程的基本块。 这两者都使程序员能够实现 OOP 中更重要的概念之一——抽象。 虽然抽象类和接口都用于实现抽象的概念,但两者的实现方式不同,用例也不同。 抽象类和接口可能看起来像初学者,但它们不能互换使用。
在本文中,我们将研究抽象类、接口的细微差别,以及两者之间的异同。 请记住,抽象类和接口只是一个概念,可以在您选择的任何面向对象编程语言中实现。 为了保持一致,我们在本文中使用的任何语法来向您解释这些概念都将是 Java 的。
在本文结束时,您可以清楚地区分抽象类和接口,以及针对特定情况实现哪些。
目录
接口——它们是什么?
OOP 中的接口可以简单地理解为各种系统之间的行为契约。 这意味着任何实现接口的类都必须为接口的所有方法提供某种实现。
接口中的所有方法都必须是公共的和抽象的。 因此,接口也被理解为“纯抽象”类。
接口的定义如下所示:
公共接口吃{
公共无效咀嚼();
公共无效消化();
}
如您所见,该定义包括在名称前加上关键字interface 。 此外,在该接口下定义了两个抽象公共方法——因此,实现上述接口的类需要提供chewing() 和digesting() 的实现; 职能。
现在让我们看看抽象类是什么,然后我们将把这两个概念放在一起,以便您更清楚地了解它们的异同。
抽象类——它们是什么?
abstract关键字总是在其声明中作为抽象类的前缀。 此外,抽象类充当为其派生的非抽象类创建的指南。 从这个意义上说,它们的声明中必须至少有一个抽象方法,同时还为其非抽象方法提供正确的实现。
抽象类的定义如下所示:
公共抽象类吃{
公共无效getReady(){
System.out.println(“我准备吃东西了”);
}
公共抽象无效开始();
公共抽象无效停止();
}
正如您在抽象类的定义中看到的, getReady()函数是一个非抽象函数,而start(); 和停止(); 函数是抽象的。
在实现抽象类时,您应该注意一些规则:
- 抽象类不能被实例化。 这意味着——我们不能从任何抽象类创建对象。
- 任何将扩展抽象类的子类都需要实现抽象类中描述的所有抽象方法。 如果子类没有实现所有抽象方法,子类也应该声明为抽象类。
现在我们已经了解了接口和抽象类的基础知识,让我们来谈谈它们有何不同、相似之处以及何时应该使用哪种方法。
接口与抽象类的异同
接口内声明的所有方法都是隐式公共和抽象的——而抽象类可以有各种修饰符来修饰它们的方法——从部分、公共、静态、受保护等等。
此外,任何用户定义的类都可以实现多个接口。 但是,它们只能实现一个抽象类。 接口和抽象类都可以有方法和变量,但它们都不能被实例化。 接口中声明的所有变量都是最终的。 但是,抽象类中声明的变量可以是非最终的,并且可以由用户定义的类进行修改。
这是抽象类和接口之间所有主要区别的摘要。
范围 | 抽象类 | 接口 |
关键词 | 使用了抽象关键字。 | 使用了interface关键字。 |
变量类型 | 可以处理最终、非最终、静态和非静态变量。 | 默认情况下只能定义静态和最终变量。 |
最终变量 | 可能会或可能不会在其中声明最终变量。 | 默认情况下,变量被声明为 final |
访问修饰符 | 可以有所有的修饰符——私有的、公共的、静态的等等。 | 只能有公共访问修饰符。 |
方法类型 | 可以有抽象方法和非抽象方法。 | 只能有抽象方法。 |
速度 | 快速地 | 慢,因为它需要额外的间接性。 |
抽象类与接口:何时选择哪个?
如果你需要一个基类来在你的代码中提供一些实现——一个抽象类就是你要走的路。 例如,您可能希望在一个类中初始化一些变量,以便在所有派生类都可以使用的方法中执行一些逻辑操作。 在这种情况下,使用抽象类是最好的选择。
但是,如果您需要为您的类提供任何附加行为,那么您应该选择接口。 实际上,接口和抽象类都将为您提供相同的功能。 但是,当您考虑编码标准时,差异就出现了。 接口帮助您实现抽象和多态——OOP 的两个重要原则。 它还允许您保持代码松散耦合而不是紧密耦合。
现在让我们总结一下接口和抽象类的用例!
何时使用接口?
接口允许程序员为他们的类构建额外的行为模式。 它允许某人从头开始并在他们想要的任何类中实现接口。 因此,接口的目的是附带的——必须添加到代码中的东西。 因此,如果您希望为类提供额外的功能并且不介意公开接口的方法(因为所有方法都是公共的),您应该继续使用接口实现。
何时使用抽象类?
与接口相比,抽象类提供了更多的结构。 抽象类带有一些方法的默认实现,甚至提供了用于完全实现抽象类的有用工具。 您应该使用抽象类在一组相关类中提供一些通用功能,同时为默认方法实现留出足够的空间。
从世界顶级大学在线学习软件开发课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
综上所述
抽象是 OOP 的重要组成部分,抽象类和接口都允许您在代码中实现某种程度的抽象。 但是,在不知道优缺点的情况下互换使用它们是错误的,并且可能导致您的代码(以及最终您的软件)出现错误和滞后。
我们希望本文能帮助您了解抽象类和接口之间的关键区别,以及一些语法知识以及它们的实现位置。
如果您有兴趣了解有关抽象类和接口的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发执行 PG 计划,该计划专为工作专业人士设计,提供 500 多个小时的严格培训、9 个以上的项目和作业, IIIT-B 校友身份,实用的实践顶点项目和顶级公司的工作协助。
如果您仍然对细微差别感到困惑,请在下方给我们留言,我们会尽快回复您!
Java中的抽象类是什么?
抽象类是不能实例化的类,也不能被继承。 它本身没有重要的操作,仅充当具体类的超类。 它仅用于提供专业化。 考虑 Car 类及其子类跑车和掀背车的示例。 抽象类 Car 可以被认为是所有子类的父类。
何时在 Java 中使用抽象类?
抽象类的主要目的是为一组相似的类提供基类。 所有扩展抽象类的类都必须实现其抽象类中定义的方法。 抽象类主要用于定义该类期望实现的特定接口。 抽象类可以用作超类,我们可以在其中定义方法,所需的方法可以在子类中实现并可以被子类继承。 使用抽象类,我们可以定义子类可以使用的通用代码,从而提高效率。
Java中的抽象类和接口有什么区别?
抽象类和接口是定义类的两种方式,其中包含一些但不是所有类要实现的方法。 这两者在静态上是不同的,实现方式也不同。 但就动态使用而言,它们是相同的。 接口只是一个只包含常量和抽象方法声明的类。 Java中没有接口的实际实现。 所以接口是完全虚拟的类。 接口用于定义类中方法和常量的契约。 它将强制类实现相同的方法和常量。 该方法可以在抽象类或子类中实现。 抽象类是包含抽象方法的类。 子类实现了这些抽象方法。 抽象类和接口可以一起使用来执行类中的某些契约。