Java中的接口

2025年4月5日 | 阅读10分钟

Java中的接口是类的蓝图。它包含静态常量和抽象方法。

Java中的接口是实现抽象的一种机制。Java接口中只能有抽象方法,不能有方法体。它用于实现抽象和Java中的多重继承

换句话说,我们可以说接口可以包含抽象方法和变量。它不能有方法体。

  • Java接口也表示“是一个”关系。
  • 就像抽象类一样,它不能被实例化。
  • 从Java 8开始,我们可以在接口中拥有默认方法和静态方法。
  • 从Java 9开始,我们可以在接口中拥有私有方法。

为什么使用Java接口?

使用接口主要有三个原因。它们如下。

  • 它用于实现抽象。
  • 通过接口,我们可以支持多重继承的功能。
  • 它用于实现松耦合。

如何声明接口?

接口使用interface关键字声明。它提供了完全的抽象;这意味着接口中的所有方法都声明为空体,所有字段默认都是public、static和final。实现接口的类必须实现接口中声明的所有方法。

语法

声明接口

在此示例中,Animal接口声明了两个方法签名:eat()和sleep()。任何实现Animal接口的类都必须为这些方法提供具体的实现。

编译器内部添加

Java编译器在接口方法之前添加public和abstract关键字。此外,它在数据成员之前添加public、static和final关键字。

换句话说,接口字段默认是public、static和final,方法是public和abstract。

interface in java

Java 8接口改进

Java 8以来,接口可以拥有默认方法和静态方法,这些将在后面讨论。

类与接口之间的关系

如下图所示,一个类继承另一个类,一个接口继承另一个接口,但一个类实现一个接口。

The relationship between class and interface

Java接口示例

在此示例中,Printable接口只有一个方法,其实现由A6类提供。

示例

编译并运行

输出

Hello

Java接口示例:Drawable

在此示例中,Drawable接口只有一个方法。Rectangle和Circle类提供了它们的实现。在实际场景中,接口由其他人定义,但不同的实现提供者提供其实现。此外,它被其他人使用。实现部分对使用接口的用户是隐藏的。

示例

编译并运行

输出

drawing circle

Java接口示例:Bank

让我们看另一个提供Bank接口实现的Java接口示例。

示例

编译并运行

输出

SBI ROI: 9.15
PNB ROI: 9.7
HDFC ROI: 8.7

通过接口实现Java中的多重继承

如果一个类实现多个接口,或者一个接口继承多个接口,这就称为多重继承。

 multiple inheritance in java

示例

编译并运行

输出

printing data...
showing data...

问)Java中的类不支持多重继承,但通过接口可以实现。为什么?

正如我们在继承章节中所解释的,由于歧义,类不支持多重继承。然而,接口支持多重继承,因为没有歧义。因为实现类提供了自己的实现。例如

示例

编译并运行

输出

Hello

如上例所示,Printable和Showable接口具有相同的方法,但它们的实现由Main类提供,因此程序中没有歧义。

接口继承

一个类实现一个接口,但一个接口可以继承另一个接口。

示例

编译并运行

输出

Hello
Welcome

接口与多态

接口最重要的优点之一是它们支持多态的能力。由于Java支持接口引用变量,我们可以使用接口类型来引用实现该接口的任何类的对象。它为我们的代码库带来了灵活性和可扩展性。

在此示例中,myAnimal是Animal类型的接口引用变量,它引用一个Dog对象。它演示了多态行为,其中方法调用在运行时根据实际对象类型解析。

Java 8接口中的默认方法

自Java 8以来,我们可以在接口中拥有方法体。但我们需要将其设为默认方法。让我们看一个例子

示例

编译并运行

输出

drawing rectangle
default method

Java 8接口中的静态方法

自Java 8以来,我们可以在接口中拥有静态方法。让我们看一个例子

示例

编译并运行

输出

drawing rectangle
27

问)什么是标记接口或标签接口?

没有成员的接口称为标记接口或标签接口,例如,Serializable、Cloneable、Remote等。它们用于向JVM提供一些基本信息,以便JVM可以执行一些有用的操作。

阅读更多Java中的标记接口

Java中的嵌套接口

注意:接口可以包含另一个接口,称为嵌套接口。我们将在嵌套类章节中详细学习它。例如,

阅读更多https: 嵌套接口

最佳实践

  • 遵循单一职责原则 (SRP):设计具有清晰且单一目的的接口。每个接口都应代表一组内聚的行为。
  • 使用接口进行抽象:接口应专注于要做什么,而不必关心如何做。它促进抽象并将实现与接口解耦。
  • 优先使用组合而非继承:接口是实现组合而非继承的关键组成部分,能够实现灵活和模块化的设计。
  • 保持接口精简:避免在接口中添加不必要的过多的方法。保持其简洁和专注,以便于理解和实现。

抽象类与接口的区别

特点抽象类Interface
定义一个被声明为abstract的类,它不能被实例化,并且可能包含抽象方法和具体方法。一个指定了类必须实现的方法的契约。
用途当需要相关类之间共享功能时使用。当需要跨类强制执行通用协议或契约时使用。
声明使用abstract关键字声明抽象类。使用interface关键字声明接口。
关键字可以使用“extends”关键字来扩展抽象类。可以使用“implements”关键字来实现接口。
方法抽象类可以包含抽象方法和非抽象方法。接口只能包含抽象方法。自Java 8以来,它还可以拥有默认方法和静态方法。
继承抽象类不支持多重继承。接口支持多重继承。
构造函数它可以包含构造函数来初始化对象。它没有构造函数,因为接口不能被实例化。
字段和变量抽象类可以包含final、non-final、static和non-static变量。接口只有static和final变量。
实施抽象类可以提供接口的实现。接口不能提供抽象类的实现。
继承抽象类可以继承另一个Java类并实现多个Java接口。接口只能继承另一个Java接口。
成员Java抽象类可以拥有类成员,如private、protected等。Java 接口的成员默认为 public。
示例public abstract class Shape{
public abstract void draw();
}
public interface Drawable{
void draw();
}

要记住的重要事项

  1. 接口提供抽象:它们定义了一个契约,而不指定实现。
  2. 接口支持多重继承:一个类可以实现多个接口。
  3. 接口中的所有字段默认都是public、static和final。
  4. 接口中的所有方法默认都是public和abstract(除了默认方法、静态方法和私有方法)。
  5. Java 8引入了默认方法和静态方法:默认方法在接口内部提供实现,而静态方法属于接口本身。
  6. Java 9在接口中引入了私有方法,这有助于在接口内部进行代码重用。
  7. 实现接口的类必须实现其所有方法,除非它是抽象类。
  8. 接口支持多态:接口引用可以持有不同实现类的对象。
  9. 标记接口(例如,Serializable、Cloneable)没有方法,但为JVM提供元数据。
  10. 接口可以继承其他接口:一个接口可以继承一个或多个接口。

结论

接口在Java编程中起着至关重要的作用,它使得创建模块化、可扩展和可维护的代码库成为可能。通过为类定义需要遵守的契约,接口促进了抽象、多态和关注点分离。有效地使用接口的能力使Java开发人员能够编写更灵活和可扩展的应用程序。


Java接口选择题

1. 关于Java中的函数式接口,以下哪项陈述是正确的?

  1. 函数式接口可以有多个抽象方法。
  2. 函数式接口只能有一个抽象方法。
  3. 函数式接口不能有任何抽象方法。
  4. 函数式接口必须继承Function类。
 

答案:b)

解释:函数式接口只有一个抽象方法(SAM-Single Abstract Method)。


2. Java中标记接口的目的是什么?

  1. 标记接口定义了类必须实现的方法。
  2. 标记接口用于标记类以进行垃圾回收。
  3. 标记接口为方法提供了默认实现。
  4. 标记接口指示实现它们的类的特殊能力或角色。
 

答案:d)

解释:Java中的标记接口是没有方法的接口(有时方法体为空),它们充当类的标签或标记。


3. 以下关于接口中的默认方法的陈述中,哪一个是错误的?

  1. 默认方法可以被实现类覆盖。
  2. 默认方法会自动提供给实现类。
  3. 子接口不能继承默认方法。
  4. 默认方法可以调用同一接口中的其他默认方法。
 

答案:c)

解释:默认方法确实可以被子接口继承。如果子接口没有覆盖其父接口的默认方法,它将继承父接口的默认实现。当接口演进时,这一特性有助于代码重用和向后兼容。


4. 在Java中,嵌套接口的目的是什么?

  1. 在接口内定义静态嵌套类。
  2. 在接口内定义接口。
  3. 在类内定义具有私有访问权限的接口。
  4. 在类内定义具有受保护访问权限的接口。
 

答案:b)

解释:Java中的嵌套接口是在其他接口内定义的接口。它们用于逻辑上分组相关的接口,并且还可以更好地组织代码。嵌套接口可以使用点表示法OuterInterface.NestedInterface来访问。


5. 关于Java中的Comparable和Comparator接口,以下哪项是真的?

  1. 两个接口都用于对对象集合进行排序。
  2. Comparator接口为对象提供了自然排序。
  3. Comparable接口允许对象相互比较。
  4. Comparator接口由正在比较的对象实现。
 

答案:c)

解释:Java中的Comparable接口允许对象根据它们的自然顺序进行比较。实现Comparable的类通过实现compareTo()方法来定义它们的自然顺序。另一方面,Comparator接口提供了一种在不脱离其自然顺序的情况下定义对象自定义排序的方法。