Java 接口
最后修改于 2024 年 1 月 27 日
在本文中,我们将展示如何使用 Java 接口。
接口定义了一个约定,任何扩展该接口的类都必须实现该约定。
遥控器是观看者和电视之间的接口。 它是这个电子设备的接口。 外交协议指导外交领域的所有活动。 道路规则是驾车者、骑自行车者和行人必须遵守的规则。 编程中的接口类似于前面的例子。
接口是
- API
- 约定
对象通过它们公开的方法与外部世界交互。 实际的实现对于程序员来说并不重要,或者也可能是秘密的。 一家公司可能会销售一个库,并且不希望公开实际的实现。 程序员可能会在 GUI 工具包的窗口上调用 `maximize` 方法,但对该方法的实现方式一无所知。 从这个角度来看,接口是对象与外部世界交互的方式,而无需过多地暴露其内部工作原理。
从第二个角度来看,接口是约定。 它们用于设计应用程序的架构并帮助组织代码。
接口是完全抽象的类型。 它们使用 `interface` 关键字声明。 在 Java 中,接口是一种引用类型,类似于只能包含常量、方法签名和嵌套类型的类。 没有方法体。 接口不能被实例化——它们只能由类实现或由其他接口扩展。
所有接口成员都隐式地具有公共访问权限。 接口不能有完全实现的方法。 一个 Java 类可以实现任意数量的接口。 一个接口也可以扩展任意数量的接口。 实现接口的类必须实现接口的所有方法签名。
接口用于模拟多重继承。 一个 Java 类只能从一个类继承,但它可以实现多个接口。 接口的多重继承不是关于继承方法和变量,而是关于继承接口描述的思想或约定。
接口的主体包含抽象方法,但由于接口中的所有方法在定义上都是抽象的,因此不需要抽象关键字。 由于接口指定了一组公开的行为,因此所有方法都是隐式公共的。 除了方法声明之外,接口还可以包含常量成员声明。 在接口中定义的所有常量值都是隐式地 `public`、`static` 和 `final`。 这些修饰符可以省略。
接口和抽象类之间有一个重要的区别。 抽象类为继承层次结构中相关的类提供部分实现。 另一方面,接口可以由彼此不相关的类实现。
Java 接口简单示例
以下是一个使用 Java 接口的简单程序。
package com.zetcode;
interface IInfo {
void doInform();
}
class Some implements IInfo {
@Override
public void doInform() {
System.out.println("This is Some Class");
}
}
public class SimpleInterface {
public static void main(String[] args) {
Some sm = new Some();
sm.doInform();
}
}
我们有一个接口和一个实现该接口的类。
interface IInfo {
void doInform();
}
这是一个接口 `IInfo`。 它具有 `doInform` 方法签名。
class Some implements IInfo {
我们实现 `IInfo` 接口。 要实现特定的接口,我们使用 `implements` 关键字。
@Override
public void doInform() {
System.out.println("This is Some Class");
}
该类为 `doInform` 方法提供了一个实现。 `@Override` 注释告诉编译器我们正在重写一个方法。
Java 多接口
Java 不允许直接从多个类继承。 它允许实现多个接口。 下一个示例展示了一个类如何实现多个接口。
package com.zetcode;
interface Device {
void switchOn();
void switchOff();
}
interface Volume {
void volumeUp();
void volumeDown();
}
interface Pluggable {
void plugIn();
void plugOff();
}
class CellPhone implements Device, Volume, Pluggable {
@Override
public void switchOn() {
System.out.println("Switching on");
}
@Override
public void switchOff() {
System.out.println("Switching on");
}
@Override
public void volumeUp() {
System.out.println("Volume up");
}
@Override
public void volumeDown() {
System.out.println("Volume down");
}
@Override
public void plugIn() {
System.out.println("Plugging in");
}
@Override
public void plugOff() {
System.out.println("Plugging off");
}
}
public class MultipleInterfaces {
public static void main(String[] args) {
CellPhone cp = new CellPhone();
cp.switchOn();
cp.volumeUp();
cp.plugIn();
}
}
我们有一个 CellPhone 类,它继承自三个接口。
class CellPhone implements Device, Volume, Pluggable {
该类实现了所有三个接口,它们用逗号分隔。 `CellPhone` 类必须实现所有三个接口的所有方法签名。
$ java com.zetcode.MultipleInterfaces Switching on Volume up Plugging in
Java 接口层次结构
下一个示例展示了接口如何形成层次结构。 接口可以使用 `extends` 关键字从其他接口继承。
package com.zetcode;
interface IInfo {
void doInform();
}
interface IVersion {
void getVersion();
}
interface ILog extends IInfo, IVersion {
void doLog();
}
class DBConnect implements ILog {
@Override
public void doInform() {
System.out.println("This is DBConnect class");
}
@Override
public void getVersion() {
System.out.println("Version 1.02");
}
@Override
public void doLog() {
System.out.println("Logging");
}
public void connect() {
System.out.println("Connecting to the database");
}
}
public class InterfaceHierarchy {
public static void main(String[] args) {
DBConnect db = new DBConnect();
db.doInform();
db.getVersion();
db.doLog();
db.connect();
}
}
我们定义了三个接口。 这些接口被组织成一个层次结构。
interface ILog extends IInfo, IVersion {
`ILog` 接口从两个接口继承。
class DBConnect implements ILog {
`DBConnect` 类实现了 `ILog` 接口。 因此,它必须实现所有三个接口的方法。
@Override
public void doInform() {
System.out.println("This is DBConnect class");
}
`DBConnect` 类实现了 `doInform` 方法。 这个方法是由 `ILog` 接口继承的,该接口被该类实现。
$ java com.zetcode.InterfaceHierarchy This is DBConnect class Version 1.02 Logging Connecting to the database
来源
在本文中,我们展示了如何使用 Java 接口。
作者
列出所有Java教程。