原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/12/04/2802086.html
英文出自 http://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 }
在上面的机器人例子,汽车制造商实现接口。Chevrolet的实现显然不同于Toyota,但是两个制造商都会遵循一样的接口。指导制造商是接口的客户,构建一个使用汽车位置的GPS数据,数字街道地图,交通数据驱动汽车的系统。做上述事情,指导系统将会调用接口方法:turn, change lanes, brake, accelerate等等。
API作为接口
机器人汽车例子演示了工业标准应用程序编程接口(API)的使用。API是常见的商业软件产品。一个公司卖软件包会包含典型的复杂的方法,其他公司会在他们自己的软件包使用它们,这个是很典型的。一个例子是,数字图像处理方法打包卖给做终端用户图形程序的公司。图像处理公司写自己的类实现接口,发布给它的客户。图形公司通过接口的签名和返回值调用图像处理方法。当图像处理公司的API是public(对于它的客户),它的API实现是接近严格保密的--事实上,它可以修改实现,一直到它继续实现客户依赖的接口。
接口和多继承
接口在java编程语言中,有很重要的另一个角色。接口不是类层次的一部分,尽管可以和类联合工作。java编程语言不允许多继承,但是接口提供一个替代方案。
java中,类只能继承一个类,但是它可以实现多个接口。所以,对象可以有多种类型:类本身的类型和实现的接口的所有类型。这意味着如果变量声明为该接口的类型,它的值也可以引用任何实现了该接口的类的实例化的对象。