接口
软件工程中存在许多情况,当不同的程序员团队同意一份“合约”来阐明他们的软件如何交互时很重要,每个组都应该能够在不知道如何编写其他组代码的情况下编写代码,一般来说,接口就是这样的合约。
例如,想象一个未来主义社会,计算机控制的机器人汽车在没有人工操作员的情况下将乘客运送到城市街道,汽车制造商编写操作汽车的软件(当然是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实现仍然是一个严密保密的秘密 — 实际上,只要它继续实现其客户所依赖的原始接口,它可以在以后修改实现。
接口总结
接口声明可以包含方法签名、默认方法、静态方法和常量定义,具有实现的方法只是默认和静态方法。
实现接口的类必须实现接口中声明的所有方法。
可以在任何可以使用类型的地方使用接口名称。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。