Java中接口与抽象类

时间:2020-01-09 10:34:46  来源:igfitidea点击:

Java中的接口和抽象类之间的区别是一个受欢迎的面试问题。由于Java中使用了抽象类和接口来实现抽象,因此了解接口和抽象类之间的区别非常重要,这样我们才能知道何时选择它们。

Java中的抽象类和接口区别

如上所述,抽象类和接口均用于实现抽象。它们都具有抽象方法,这些抽象方法由实现接口/扩展抽象类的类实现。还有其他相似之处,例如它们都无法实例化。

通过添加新功能(例如添加默认方法和静态方法的能力)来改进Java接口的方式,从Java 8开始和从接口私有方法开始,从Java 9开始使接口类似于抽象类,但是仍然存在差异,因此让我们来了解一下之间的差异Java中的接口和抽象类。

接口和抽象类比较

  • 抽象类既可以具有抽象方法,也可以具有实现方法。在Java 7之前的接口只能具有公共抽象方法。从Java 8开始,为接口添加了默认和静态方法的功能被添加,但是访问修饰符仍然必须是公共的。从Java 9开始,私有方法也可以添加到Java接口中。因此,接口和抽象类之间的差异日益缩小。唯一的事情是抽象类可以具有受保护的访问修饰符的方法以及默认(程序包专用)访问权限,而接口则不能具有此类方法。
  • 抽象类可以具有非静态和最终字段。在接口中,所有字段都自动为public,static和final,并用于定义常量。
  • 抽象类可以具有构造函数以初始化抽象类中的字段。由于Java中的接口不能包含实例变量,因此也不需要构造函数来初始化这些字段。因此,接口不能具有构造函数。这是显示抽象类中的构造函数的示例。
public abstract class Payment {
  private String customerName;
  private String customerAddress;
  public Payment() {
    
  }
  public Payment(String customerName, String customerAddress){
    this.customerName = customerName;
    this.customerAddress = customerAddress;
  }
  ..
  ..
}

class CashPayment extends Payment {
  CashPayment(String customerName, String customerAddress){
    super(customerName, customerAddress);
  }
  ..
  ..
}
  • Java中的抽象类最多可以扩展一个类(抽象或者非抽象),但能够实现多个接口。尽管接口可以扩展多个接口,但接口不能扩展类。
  • Java中的另一个类扩展了一个抽象类。扩展类应实现扩展的抽象类的所有抽象方法。如果该类没有这样做,则应将其声明为抽象本身。接口由Java中的类实现。实现类应实现所实现接口的所有公共抽象方法。如果该类未实现接口的所有公共抽象方法,则应将其声明为抽象本身。

使用什么–抽象类还是接口

现在一个非常相关的问题是,应该使用哪个抽象类或者接口?

我们应该考虑在以下情况之一中使用抽象类:

  • 如果我们有一组紧密相关的类,它们共享一些常用功能和字段。在那种情况下,抽象类可以具有作为实现方法的通用功能,以及这些类之间的区别的抽象方法。
  • 如果我们想在父类中拥有受保护的或者默认的访问方法以及抽象方法。
  • 我们要声明非静态或者非最终字段。这使我们能够定义可以访问和修改它们所属对象的状态的方法。

我们应考虑在以下情况之一中使用接口:

  • 我们期望不相关的类将实现接口。例如,任何库都可以具有由不同应用程序中许多不相关类实现的接口。
  • 我们想指定行为,即特定数据类型的合同,但不关心谁实现其行为以及如何实现。
  • 我们希望拥有多重继承,因为Java中的类是不可能的。