使用关键字interface来定义一个接口。接口的定义和类定义很相似,分为接口声明和接口体。
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口中只有抽象方法,没有普通方法。而且接口体中所有的常量的访问权限一定都是public,而且是static常量,所有抽象方法的访问权限一定都是public(允许省略public abstract修饰符)。接口中的常量一定是public final static修饰的。
在java语言中,接口由类来实现以便使用接口中的方法。如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。由于接口中的方法一定是public abstract方法,所以类在重写接口方法时不仅要去掉abstract修饰符、给出方法体,而且方法的访问权限一定要明显地用public来修饰(否则会降低访问权限)。
程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。
定义接口时,如果关键字interface前面加上public,就称这样的接口是一个public接口。public接口可以被任何一个类实现。如果一个接口不加public修饰,就称做友好接口,友好接口可以被与该接口在同一包中的类实现。
如果父类实现了某个接口,那么子类自然实现了该接口。
接口也支持继承,支持多继承,类可以同时实现多个接口。
接口的思想在于它可以要求某些类有相同名称的方法,但方法的具体内容可以不同,即要求这些类实现接口,以保证这些类一定有接口中所声明的方法。
接口回调
和类一样,接口也是java中一种重要数据类型,用接口声明的变量称作接口变量。
在java中,接口回调是指:可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口方法。
接口回调非常类似于上转型对象调用子类重写的方法。接口回调和上转型对象是多态的体现。由接口产生的多态就是指不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量在回调接口方法时就可能具有多种形态。
如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,可以考虑使用接口。
面向接口编程
使用接口进行程序设计的核心思想是使用接口回调,即接口变量存放实现该接口的类的对象的引用。