抽象地讲,类的接口是类允许其他类对象访问的方法与字段集。接口通常代表一种承诺,即方法需要实现接口方法名表示的操作,遵循代码注释、测试和其他文档说明。类的实现就是位于方法体中的代码
Java将接口概念提升为独立的结构,体现了接口(对象必须遵循的承诺)与实现(对象如何履行承诺)的分离。Java接口允许多个类提供相同的功能,也允许一个类同时实现多个接口。
许多设计模式都使用了Java内建的这一特性。例如,运用适配器(Adapter)模式,通过使用一个接口类型来适配类的接口,从而满足客户的需要。但是,若要用好Java基本的内建特性,就要从接口开始,确保自己掌握了Java特性的工作原理。
接口与抽象类
最初的Design Patterns一书总是提到抽象类的使用,而对于接口的使用只字不提。这是因为编写该书实例的C++与Smalltalk语言根本就没有接口结构。由于Java接口与抽象类非常相似,这一点并不影响Java开发人员对该书的理解。
挑战2.1
写出在Java中抽象类和接口的三点区别。
答案参见第297页
如果不能使用接口,完全可以像C++那样使用抽象类。然而,作为一种独立的结构,接口在n层应用程序开发过程中的地位举足轻重。
让我们考虑一个火箭仿真类所必须实现的接口定义。工程师设计了许多不同的火箭,包括固体燃料火箭和液体燃料火箭,这两种火箭有着完全不同的弹道学原理。不管火箭如何组成,对火箭的仿真都必须提供预期推力与质量等数据。下面是Oozinoz定义的火箭仿真接口:
package com.oozinoz.simulation;
public interface RocketSim {
abstract double getMass();
public double getThrust();
void setSimTime(double t);
}
挑战2.2
下面的描述哪些是正确的?
A.尽管只有getMass()方法被显式声明为抽象,但RocketSim接口的三个方法都是抽象方法。
B.尽管只有getThrust()方法被显式声明为公开,但RocketSim接口的三个方法都是公开方法。
C.接口虽然被声明为“公有接口”,但即使省略public关键字,接口仍然是公有的。
D.可以创建另外一个接口,例如RocketSimSolid,去扩展RocketSim接口。
E.每个接口必须至少包含一个方法。
F.接口可以声明实例字段,实现该接口的类也必须声明该字段。
G.虽然不能实例化接口,但接口仍然可以定义构造函数,并要求实现类必须提供具有相同签名的构造函数。
答案参见第297页