文档

Java™ 教程-Java Tutorials 中文版
接口
Trail: Learning the Java Language
Lesson: Interfaces and Inheritance

接口

在软件工程中,有很多情况下,对于不同的程序员群体来说,同意遵守一份 "合约" 是很重要的,它可以解释他们的软件是如何交互的。每个组都应该能够在不知道如何编写其他组代码的情况下编写代码。一般来说,interfaces (接口) 就是这样的合约。

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

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

Java 中的接口

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

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

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
}

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

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

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 实现仍然是一个严密保密的机密 - 实际上,它可能会在以后修改实现,只要它继续实现原始的客户依赖的接口。


Previous page: Interfaces and Inheritance
Next page: Defining an Interface