浏览以下内容前,请点击并阅读 声明
接口是java语言中的一个引用类型,和类一样,接口可以包含常量,方法签名,默认方法,静态方法和嵌套类型。含有方法主体的只有其中的默认方法和静态方法。接口不能被实例化,它们只能被类实现或者被其他接口继承。
接口的声明部分包含修饰词,关键词interface,接口名称,extends关键词+由逗号分隔开的继承接口名称(可有可无),和一个接口主体,如下例所示:
public interface GroupedInterface extends Interface1, Interface2, Interface3 { // 定义一个常量 double E = 2.718282; // 方法签名 void doSomething (int i, double x); int doSomethingElse(String s); }
public修饰词表明该接口可以用在任何地方,没有该修饰词,则该接口仅在程序包内可见。
接口可以继承其他接口,和类的继承类似,不过接口可以继承多个接口,而类只能继承一个父类。
接口的主体由一对花括号和括号内的代码组成,接口主体中可以包含抽象方法,默认方法和静态方法,抽象方法只有方法签名,以分号结尾,默认方法以关键词default修饰,静态方法以关键词static修饰,接口中所有的方法可视范围隐含地为public,所以可以省略public修饰词。
除了上述三中方法意外,接口中还可包含常量声明,常量隐含的修饰词为public,static,final,可以省略,另外接口主体中还可包含嵌套类型。
实现接口
要定义一个实现某接口的类,就要在类的声明中包含implements短语,就是在继承类名称(没有继承的类则在需要声明的类名称之后)后接implements关键词+实现的接口名称,一个类可实现多个接口,由逗号隔开,类的主体中必须实现接口中定义的抽象方法,方法的签名要与接口中的一致,如下例所示:
//接口Relatable中有一个名为isLargerThan的抽象方法(声明为 public int isLargerThan(Relatable other);), //所以要实现这个接口,类中必须提供该方法的实现 public class RectanglePlus implements Relatable { public int isLargerThan(Relatable other) { //... }
//省略其他方法声明...
}
将接口视为引用类型
接口的名称可以用在任何可以使用其他数据类型名称的地方,如果定义一个变量的类型为某个接口,则赋值给该变量的对象类型必须是实现该接口的类。
//以下Intf是一个接口,而IntfImpl实现了该接口,可以将IntfImpl实例赋值给Intf类型的变量 Intf var=new IntfImpl()
接口的演变
一个接口一般不会是一成不变的,有时候会按照需求给接口添加一些新方法,如果是添加抽象方法的话,实现旧接口的类因为没有实现新添加的方法而将无法与新接口兼容,一个可行的解决方法就是将新添加的方法设置为默认方法,这样,就能使新接口与旧的类兼容,在接口中声明默认方法必须提供该方法的主体。此外,也可在接口中添加静态方法,这样,旧的类无需修改或者重新编译就可直接使用新添加的方法。
默认方法
默认方法的使用能够向接口添加新功能的同时又能保证与原有实现该接口类的兼容性。
默认方法的继承
当有一个接口继承一个含有默认方法的接口时,可以对接口中的默认方法作如下处理:
- 不提及父接口的默认方法,这样该接口就继承了父接口的默认方法
- 重新声明默认方法,将其变为抽象方法
- 重新定义默认方法,即覆写
静态方法
在接口中定义静态方法,则其所有的实现类将继承该静态方法。