在面向对象程序设计中,定义一个类必须做什么而不是将怎么做有时是很有益的.你已经看到了一个这样的例子:抽象方法.抽象方法为方法定义了签名但不提供实现方式.一个子类必须自己实现由其超类定义的抽象方法.这样,抽象方法就指定了方法的接口而不是实现.尽管抽象类和方法很有用,但是还可以将这一概念进一步延伸.在Java中,可以使用关键字interface把类的接口和实现方式完全分开.
在语法上,接口类似于抽象类.然而,在接口里,任何方法都不包含实体.也就是说,接口不提供任何实现方式.他仅指定必须做什么,但是不说明如何做.一旦接口被定义,任意数量的类都可以实现他.而且,一个类可以实现任意数量的接口.
为了实现接口,类必须为接口描述的方式实现同一个接口,但是接口对于这些对象是相同的.通过提供interfafce关键字,Java允许充分利用”一个接口,多个方法”的多态性.
在继续讲解之前,有一个重要点值得一提.JDK8中为接口新增了一个特性,该特性使接口的功能发生了很大的变化.JDK8之前,接口仅能定义可以做什么,但不说明如何去做,这一点前面已经描述过.但JDK8改变了这一点,现在,可以向接口方法添加一个默认实现,这样就能指定接口的行为.然而,从本质上讲,默认方法是一个具有特殊用途的特性,仍然保留了接口的最初用途.因此,作为一条通用规则,通常仍然会创建和使用不包含默认方法的接口.基于这个原因,我们首先将讨论接口的一般形式:
access interface name { ret-type method-name1(param-list); ret-type method-name2(param-list); type var1 = value; type var2 = value; }
这里,access要么是public,要么不使用.当不包含访问修饰符时,执行默认的访问方式,接口仅对于他所在的包的其他成员可用.当接口被声明为public时,可以被任何其他代码使用(当一个接口被声明为public时,他必须位于同名的文件中).name是接口的名字,可以是任何有效的标识符.
在接口的一般形式中,方法的声明仅仅使用其返回类型和签名.实际上,他们是抽象方法.这样,包含接口的每一个类都必须实现全部方法.在接口中,方法隐式声明为public.
在接口中声明的变量不是实例变量.相反,他们被隐式声明为public,final和static,并且必须被初始化.因此,他们实际上是常量.下面是一个接口定义的例子,他将这个接口指定给一个类,这个类会生成一系列数字:
public interface series { int getNext(); //return next number in series void reset(); //restart }
这个接口被声明为public,所以他可以被任何包中的代码实现.