抽象类和接口用于 Java 中的抽象。 面向对象编程中的抽象是指对最终用户隐藏实现细节。
在抽象中,您可以知道功能是什么,但无法知道它们是如何实现的。
让我们看看它们中的每一个,并尝试理解它们被使用的原因。
抽象类
不能实例化为对象并且可能有也可能没有抽象方法的类在 Java 中称为抽象类。 抽象方法是在声明时没有实现体的方法。
抽象类 GraphicObject 的示例 – Oracle
您可以通过在 class 关键字之前指定 abstract 关键字来创建抽象类。
abstract class abstractClass { void run() { System.out.println("ran"); } }
抽象类可以被其他类扩展。 换句话说,它也可以被子类化。
abstract class AbstractClass { void run() { System.out.println("ran"); } } class ExtendingAbstractClass extends AbstractClass { void newMethod() { System.out.println("new"); } @Override void run() { System.out.println("override"); } }
抽象类用于在扩展给定抽象类的多个类之间实现公共方法。 此外,在抽象类中定义抽象方法的能力使它们对于具有相似方法但具有不同实现的类非常有用。 让我们举个例子。
考虑一辆具有某些功能的汽车,例如启动、停止、倒车等。这些功能在所有类型的汽车中都很常见。
但是自动驾驶等自动化功能呢? 这些功能的实现可能因不同类型的汽车而异。 让我们看看如何创建与之相关的面向对象程序。
首先,创建一个 Car 类,它将由多个不同汽车类型的类扩展。
abstract class Car { void start() { // implementation System.out.println("runs car"); } void stop() { // implementation System.out.println("engine stops"); } void reverse() { // implementation System.out.println("reverse mode enabled"); } abstract void selfDrive(); }
方法 start()、stop() 和 reverse() 是所有汽车中通用的方法。 所以它们的实现已经在 Car 类本身中定义了。 但是,某种类型的汽车可以有不同的自动驾驶模式实现。 因此,您可以将 selfDrive() 定义为一个抽象方法,并在不同类型的汽车的不同类别中以不同的方式实现它。
class CarTypeA extends Car { @Override void start() { super.start(); } @Override void stop() { super.stop(); } @Override void reverse() { super.reverse(); } void selfDrive() { // custom implementation System.out.println("Type A self driving mode enabled"); } }
class CarTypeB extends Car { // ...all similar methods void selfDrive() { // custom implementation // different implementation than CarTypeB System.out.println("Type B self driving mode enabled"); } }
需要注意的是,如果一个子类没有实现抽象类中定义的所有抽象方法,那么它应该被声明为一个抽象类本身。
界面
接口是一种告诉类必须由它实现哪些方法的方法。 例如,如果你考虑汽车的例子,它有一些基本功能。 它可以启动、移动和停止。 这些功能在所有汽车中都很常见。
因此,如果您在类中实现汽车的接口,则必须实现汽车的所有方法才能正常安全地运行。
与抽象类类似,我们不能实例化或创建接口的对象。 它可以被认为是一个完全抽象的类,因为它只包含抽象方法,即没有实现主体的方法。
您可以使用 interface 关键字创建接口。
interface CAR { void start(); void stop(); void move(); }
在定义类时使用 implements 关键字来实现接口。
class CarTypeB implements CAR { public void start() { System.out.println("started"); } public void stop() { System.out.println("stopped"); } public void move() { System.out.println("running"); } }
相似
没有实例化为对象是抽象类和接口的共同点。
差异
Abstract ClassInterfaceInheritance & Implementation 一个类只能继承一个抽象类。一个类可以实现多个接口。变量类型可以有final、non-final、static、non-static变量。可以只有static和final变量。方法类型既可以包含抽象方法,也可以包含非抽象方法。只能包含抽象方法,静态方法除外。访问修饰符抽象类可以有访问修饰符。接口中定义的方法签名默认是public的。 接口没有访问修饰符。Constructors & Destructors它可以声明构造函数和析构函数。它不能声明构造函数或析构函数。SpeedFastSlow抽象类和接口的区别
什么时候使用抽象类和接口?
在以下情况下使用抽象类:
- 你想在多个类之间共享一些通用的方法和字段。
- 声明非静态和非最终字段以修改它们绑定到的对象的状态。
您可以在以下情况下使用接口:
- 您想要定义实现该接口的类的行为,但您不关心它的实现方式。
- 您希望确保一个类实现了所有方法以正常运行。
最后的话
接口主要用于创建 API,因为它们可以提供实现功能的结构,而无需担心实际的实现。
抽象类一般用于多个类之间共享公共的抽象和非抽象方法,对抽象类进行扩展,使代码的复用性更高。
借助这些 Java 在线课程,了解有关 Java 的更多信息。 您正在准备 Java 面试吗? 这里有一些关于面向对象编程的面试问题。