# 接口

> 原文： [https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html](https://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)

软件工程中有许多情况，当不同的程序员团队同意一份“合同”来阐明他们的软件如何相互作用时，这是很重要的。每个组都应该能够编写代码，而不必知道如何编写其他组的代码。一般来说，_ 接口 _ 就是这样的合约。

例如，想象一个未来主义社会，计算机控制的机器人汽车在没有人工运算符的情况下将乘客运送到城市街道。汽车制造商编写操作汽车的软件（当然是 Java） - 停止，启动，加速，左转等等。另一个工业集团，电子制导仪器制造商，使计算机系统接收 GPS（全球定位系统）位置数据和无线传输交通状况并利用该信息来驾驶汽车。

汽车制造商必须发布一个行业标准的界面，详细说明可以调用什么方法来使汽车移动（任何汽车，来自任何制造商）。然后，指导制造商可以编写调用界面中描述的方法的软件来命令汽车。工业集团都不需要知道如何实现其他集团的软件。事实上，每个小组都认为其软件具有高度专有性，并保留随时修改它的权利，只要它继续遵守已发布的界面即可。

## Java 中的接口

在 Java 编程语言中，_ 接口 _ 是一个类似于类的引用类型，它只能包含常量，方法签名，默认方法，静态方法和嵌套类型。方法体仅适用于默认方法和静态方法。接口无法实例化 - 它们只能通过类 _ 实现 _ 或通过其他接口 _ 扩展 _。扩展将在本课程后面讨论。

定义接口类似于创建新类：

```
public interface OperateCar {

   // constant declarations, if any

   // method signatures

   // An enum with values RIGHT, LEFT
   int turn(Direction direction,
            double radius,
            double startSpeed,
            double endSpeed);
   int changeLanes(Direction direction,
                   double startSpeed,
                   double endSpeed);
   int signalTurn(Direction direction,
                  boolean signalOn);
   int getRadarFront(double distanceToCar,
                     double speedOfCar);
   int getRadarRear(double distanceToCar,
                    double speedOfCar);
         ......
   // more method signatures
}

```

请注意，方法签名没有大括号，并以分号结束。

要使用接口，可以编写 _ 实现 _ 接口的类。当可实例化的类实现接口时，它为接口中声明的每个方法提供方法体。例如，

```
public class OperateBMW760i implements OperateCar {

    // the OperateCar method signatures, with implementation --
    // for example:
    int signalTurn(Direction direction, boolean signalOn) {
       // code to turn BMW's LEFT turn indicator lights on
       // code to turn BMW's LEFT turn indicator lights off
       // code to turn BMW's RIGHT turn indicator lights on
       // code to turn BMW's RIGHT turn indicator lights off
    }

    // other members, as needed -- for example, helper classes not 
    // visible to clients of the interface
}

```

在上面的机器人汽车示例中，汽车制造商将实现该界面。当然，雪佛兰的实现将与丰田的实现大不相同，但两家制造商都将遵循相同的界面。作为界面客户的指导制造商将构建使用汽车位置上的 GPS 数据，数字街道地图和交通数据来驱动汽车的系统。这样，引导系统将调用界面方法：转弯，改变车道，制动，加速等。

## 接口作为 API

机器人汽车示例显示了用作行业标准的接口 _ 应用程序编程接口（API）_。 API 在商业软件产品中也很常见。通常，公司销售的软件包包含另一家公司希望在其自己的软件产品中使用的复杂方法。一个例子是销售给制作最终用户图形程序的公司的数字图像处理方法包。图像处理公司编写其类以实现接口，并将其公开给客户。然后，图形公司使用界面中定义的签名和返回类型调用图像处理方法。虽然图像处理公司的 API 是公开的（对其客户），但它的 API 实现仍然是一个严密保密的秘密 - 实际上，它可以在以后修改实现，只要它继续实现原始接口它的客户所依赖的。