软件工程中存在许多状况,当不一样的程序员团队赞成一份“合约”来阐明他们的软件如何交互时很重要,每一个组都应该可以在不知道如何编写其余组代码的状况下编写代码,通常来讲,接口就是这样的合约。程序员
例如,想象一个将来主义社会,计算机控制的机器人汽车在没有人工操做员的状况下将乘客运送到城市街道,汽车制造商编写操做汽车的软件(固然是Java) - 中止,启动,加速,向左转,等等,另外一个工业集团,电子制导仪器制造商,使计算机系统接收GPS(全球定位系统)位置数据和无线传输交通情况,并利用该信息来驾驶汽车。编程
汽车制造商必须发布一个行业标准的接口,详细说明能够调用什么方法来使汽车移动(任何汽车,来自任何制造商),而后,指导制造商能够编写调用接口中描述的方法的软件来命令汽车,工业集团都不须要知道其余集团的软件是如何实现的,事实上,每一个小组都认为其软件具备高度专有性,并保留随时修改它的权利,只要它继续遵照已发布的接口便可。segmentfault
在Java编程语言中,接口是相似于类的引用类型,它只能包含常量、方法签名,默认方法、静态方法和嵌套类型,方法体仅适用于默认方法和静态方法,接口没法实例化 — 它们只能由类实现或由其余接口继承,继承将在本课程后面讨论。编程语言
定义接口相似于建立新类:code
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数据、数字街道地图和交通数据驱动汽车的系统,这样,导航系统将调用接口方法:转弯,改变车道,制动,加速等。get
机器人汽车示例显示了用做行业标准应用程序编程接口(API)的接口,API在商业软件产品中也很常见,一般,公司销售的软件包包含另外一家公司但愿在其本身的软件产品中使用的复杂方法。一个例子是销售给制做最终用户图形程序的公司的数字图像处理方法包,图像处理公司编写其类以实现接口,该接口向其客户公开,而后,图形公司使用接口中定义的签名和返回类型调用图像处理方法。虽然图像处理公司的API是公开的(对其客户),但它的API实现仍然是一个严密保密的秘密 — 实际上,只要它继续实现其客户所依赖的原始接口,它能够在之后修改实现。产品
接口声明能够包含方法签名、默认方法、静态方法和常量定义,具备实现的方法只是默认和静态方法。it
实现接口的类必须实现接口中声明的全部方法。
能够在任何可使用类型的地方使用接口名称。