Java接口的优势在于它限制了对象之间的协作,这种约束其实提供了更大的自由。即使实现接口的类的实现发生了巨大变化,接口的客户端仍然可以不受影响。
开发人员在创建RocketSim接口的实现类时,有责任编写getMass()和getThrust()方法,返回火箭的性能指标。换言之,开发人员必须遵循这些方法制订的契约。
有时候,接口指定的方法并不要求必须为调用者提供服务。在某些情况下,实现类可以忽略这些调用,为实现的方法提供一个空的方法体。
挑战2.3
请列举一个接口,它包含的方法并不要求实现该接口的类必须返回值,或者代表调用者执行若干操作。
答案参见第298页
如果创建的接口指定了一系列用于通知的方法,则可以考虑提供桩(stub),即提供空实现的接口实现类。开发者通过实现桩的子类,重写那些对应用程序具有重要意义的接口方法。java.awt.event中的WindowAdapter就是这样一个例子,如图2.1所示。(若要进一步了解UML,请参见附录D)。WindowAdapter类实现了WindowListener接口的所有方法,但这些实现都是空的,方法不含任何语句。

图2.1 WindowAdapter类注册监听器,可以方便地监听window事件,从而使我们忽略自己并不关心的事件
除了声明方法外,接口也可以声明常量。在下面的例子中,ClassificationConstants声明了两个常量译注[1],实现该接口的类可以访问它们。
public interface ClassificationConstants {
static final int CONSUMER = 1;
static final int DISPLAY = 2;
}
接口与抽象类还有一点关键区别:虽然类只能声明扩展一个类,却可以声明实现多个接口
译注[1]:在JDK 1.5引入enum类型后,通常不建议在接口中声明常量,而是尽量将具有分组类别的常量定义为enum类型。