面向对象高级之接口
接口
接口(interface)是一种特殊的抽象类,本质上不是一个类,里面只能包含常量和方法的定义(不允许实现),接口就是一套未实现方法的集合。
声明语法
[修饰符] 接口名称{
[常量定义]
[抽象方法的定义]
}
从以上表现来看,接口中不存在像普通类一样的属性,以及普通方法,因此接口实际上就是一套标准,既然是标准,那就必然存在实现,java中的类可以实现多个接口,从而弥补了类只能单继承的缺点。如果一个子类实现了多个接口,那么这个子类就必须实现所有的抽象方法(除非这个子类是抽象类).
注意事项:
- 接口中只能存在常量和抽象方法(JDK1.8以前)(在JDK1.8之后接口新增了默认方法)
- 接口允许继承接口,并且能多继承
- 接口不允许继承任何类(包括抽象类)
- 接口允许有多个子类实现,并且子类可以同时实现多个接口
- 接口不属于类,因此不存在构造器,所以也无法实例化
JDK8基于接口的新特性
JDK版本更新迭代后新版本的JDK中对于接口新增很多新特性,比如:接口默认方法,静态方法,函数式接口等。
某些情况下,可能实现类只需要对于接口中的部分方法实现而非所有方法,因此在这种需求下JDK新增了默认方法的设定,将一些实现类只需选择性实现的方法定义为default方法,这样一来,这些子类(实现类)就可以不一定实现。
例如:
public interface CategoryManager {
//JDK8默认方法
default boolean updateCname(Category c){
return false;
}
//JDK8默认方法
default boolean delete(int cid){
return false;
}
以上接口中updateCname和delete方法为默认方法,因此,子类可以无需实现这两个方法。这种操作,是JDK中一种兼容性的解决方案。
接口静态方法
JDK中除了对接口新增默认方法外,还新增接口的静态方法,即在接口直接将方法定义为静态的已实现方法,这样一来,就无需创建接口的实现类来调用,直接通过接口名.方法()即可调用,大大提高方法调用的便利性.
public interface CategoryManage {
//JDK8接口静态方法:该方法可以直接通过接口名调用(无需创建对象)
static String showMsg(){
return "HelloInterface";
}
#函数式接口(@FunctionalInterface)
所谓函数式接口是JDK8中新增的一种概念,表名一个接口中只存在一个未实现方法(可以包含默认方法,静态方法和从Object中继承的方法)
@FunctionalInterface
public interface Runable {
void run();
}