- 接口的语法
- 接口概念上的特点
- 接口的优点
- 接口结构上的特点
- 接口的声明特点
- 接口的命名格式
- 接口成员的特点
- 接口的子类(实现类)
- 总结辨析类和接口的继承/实现机制
- 接口中的实现方法
- 默认实现方法
- 静态实现方法
当我们对于多个类(这些类已经各自继承了某个类)需要同时拓展某一种行为时,假如使用抽象类中的抽象方法,虽然这样能够体现出行为并且体现了行为的标准和规范,但是在实际上是不能这样做的,原因为:
- 第一,这个抽象类里面是对功能和行为的抽象,缺少属性,不符合类的定义。
- 第二,Java不支持多继承,对于已经继承了直接父类的子类,不能再继承这个抽象类。
- 第二,这个抽象类不符合继承的“is-a”关系,即使一个类没有继承别的类,让它去继承这个抽象类也是不符合继承的“is-a”关系的。
那么就需要一种新的,区别于类的结构,这个结构就是接口(interface)。相比于类,接口具有这些特点:
- 不强调属性,只强调行为的抽象,“继承”它表示功能的扩展。(这种“继承”在接口中称为“实现”)
- 在一个类已经继承某个类之后,还可以“继承”接口,不受单继承限制。
- 没有“is-a”继承关系的限制。
- 最好有抽象方法表示规范和标准。
以上的描述相对笼统,在下文会详细阐述接口的相关内容。
接口的语法
[访问权限修饰符] interface 接口名{
}
解释:
- 接口的访问权限修饰符和class一样,有两种访问权限(public和默认)。
- interface和class是同种级别的数据类型,它们都是引用数据类型,是平行的关系,class表示声明类,interface表示声明接口。
- 接口名的命名规范也和类名一样遵循“大驼峰”。
接口概念上的特点
- 接口和抽象类一样,都不能创建对象。
- 接口注重对行为的抽象,接口中可以定义抽象方法。
- 接口的“实现”,一个普通类可以使用关键字implements实现接口。实现接口的类,可以称之为接口的“子类”或者“实现类”,接口可以称之为该类的“父接口”。
- 一个普通类可以在继承类的同时再去实现接口,但注意书写顺序要“先继承类,再实现接口”。普通类实现接口,也必须实现接口中的所有抽象方法,这也是方法的重写。
- 与继承的“单继承”不同,接口的实现是“多实现”,一个类可以实现多个接口
接口的优点
- 接口不受单继承限制,一个类可以在继承某个类的同时,再去实现接口,而且可以实现多个接口。
- 接口不是类,它和它的实现类之间不需要存在“is-a”关系,接口比抽象类的使用更加灵活。而接口和它的实现类之间的关系称之为“like-a”关系。
- 接口表示对功能的扩展,它只关注行为,不关注属性,只要需要扩展功能就用接口。
接口结构上的特点 接口的声明特点
- 接口是抽象的,不能创建对象,在接口声明的语法中本身隐含了“abstract”关键字,这个关键字不要写出。
- 接口定义出来就是为了实现的,所以接口不能用final修饰。
接口的命名格式
接口的命名没有固定的特殊格式,通常在接口名之前加上大写“I”来表示这是一个接口。
接口成员的特点
-
变量
接口中定义变量全部默认被“public static final”修饰,所以接口中只能定义全局常量。
- 隐含的public的访问权限不可更改。
- “public static final”是隐含的,不要写出,在定义全局常量时直接写“数据类型 常量名”然后赋值即可。
- 接口中不允许定义静态代码块,所以接口中的全局常量必须显式赋值。
- 由于接口多数情况下表示对功能、行为的扩展,所以绝大多数情况下接口中都没有全局常量。只有当认为接口的所有实现类都需要一个全局常量时才考虑在接口中定义全局常量。
-
方法
接口中的方法默认都是“public abstract”修饰的抽象方法。
- 在Java8之前,接口中只有抽象方法,从Java8开始,接口中允许出现实现方法。
- “public abstract”是隐含的,不要写出,直接写返回值类型、方法名等结构即可。
- 接口中的抽象方法和抽象类中的抽象方法一样,同样是占位作用,普通类实现接口,必须实现接口中所有的抽象方法。
- 绝大多数情况下,接口中定义的都是抽象方法。
-
构造器
接口中不需要构造器,也没有构造器,因为接口既不需要创建对象,又没有成员变量需要赋值,不论是接口自身还是它的实现类,都不需要接口中存在构造器。
-
代码块
接口没有构造代码块和静态代码块。
总结:
接口和class区别很大,只能定义全局常量和抽象方法(Java8开始也能定义用于实现的方法),但实际开发中,绝大多数情况下,接口都只会定义抽象方法。
接口的子类(实现类)
如何使用接口,都有哪些结构可以作为实现接口的子类:
- 普通类:普通类实现接口必须实现接口中所有抽象方法。
- 抽象类:抽象类实现接口无需实现抽象方法,也可以选择实现部分抽象方法。
- 接口:接口的子类可以是接口,但这是接口继承接口,而不是接口实现接口。接口之间的继承可以多继承。
总结辨析类和接口的继承/实现机制
继承(extends)
继承不能跨越类和接口,只能类和类继承,接口和接口继承,接口和类,没有继承关系。不同结构的继承具体如下:
- 普通类继承一个抽象类:需要实现抽象类中所有抽象方法。
- 抽象类继承一个抽象类:按需实现里面的部分抽象方法,也可以不实现。
- 抽象类继承一个普通类:可以但少见。
- 接口继承一个接口:会得到那个接口的所有抽象方法。
注:类的继承是单继承,接口的继承是多继承。
实现(implements)
实现必须发生在类与接口之间,是单向的,只有类实现接口,而接口和类没有直接关系(接口不能继承类,也不能实现类)。
- 普通类实现接口:必须实现所有抽象方法。
- 抽象类实现接口:按需实现抽象方法,也可以不实现。
接口中的实现方法
上文提到接口中可以定义实现方法,自Java8开始,接口中新增了默认实现方法和静态实现方法两种带有方法体的实现方法。
默认实现方法default 返回值类型 方法名(形参列表){
// 方法体
}
注:这里的default不是访问权限修饰符的默认包私有,接口中的方法默认访问权限修饰符为public不可更改。
默认实现方法可以看成是抽象类中的成员方法,接口不能创建对象,不能直接调用该实现方法,需要创建接口的实现类(子类)对象来调用它。
但是默认实现方法并不是抽象方法,不需要子类强制实现,但是子类可以选择重写。
作用
- 接口中一旦有了默认实现方法,增加了设计接口的灵活性,对于子类不需要的方法就不必在子类中实现。
- 接口中的默认实现方法,可以配合接口的“多实现”,实现真正意义上的多继承。
静态实现方法
static 返回值类型 方法名(形参列表){
// 方法体
}
注:接口中方法的访问权限修饰符是public不可更改。
静态实现方法调用时只能使用“接口名.方法名”调用,接口子类类名无法调用它。



