6.1 概述
# 接口是一个特殊的抽象类,接口中所有方法都没有方法体
# Java接口文件的文件名必须与接口名相同
6.2 接口定义
# 定义关键字: interface
# 语法格式
[修饰符] interface 接口名 [extends 父接口名列表]{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
- 修饰符:指定接口访问权限,可选值 public。 省略则使用默认访问权限
- 接口名:指定接口的名称, 接口名必须是合法标志符。 一般情况下要求首字母大写
- 方法:接口中的方法只有定义没有实现
6.3 接口继承
# 特点
- 可以被继承
- 可以实现多继承,可以有多个直接父接口 【类继承不能有多个父类】
- 继承父类接口时,获得父类接口定义的所有抽象方法、常量属性等
- 继承多个父类接口时,各个父类接口之间用英文逗号隔开
6.4 接口实现
# 实现关键字: implements
# 语法格式
[修饰符] class <类名> [extends 父类名] [implements 接口列表]{
............
}
- 接口实现时,方法的名字、返回值类型、参数个数及类型必须与接口完全一致且必须实现接口中的所有方法
# 父接口的常量、方法名冲突
- 常量冲突,需明确指出常量的接口 “接口名.常量”
- 方法冲突,实现一个方法就行
6.5 接口与抽象类
# 共同点
- 不能被实例化,只能被继承
- 都可以包含抽象方法,一旦被继承,抽象方法必须全部实现
# 差别
- 接口->规范 but 抽象类->模板式设计 [中间产品]
- 抽象类可以有普通方法,接口不可以
- 抽象类可以定义静态方法,接口不可以
- 抽象类可以包含构造器 让子类调用并完成初始化操作,接口不可以
- 抽象类可以包含初始化快, 接口不可以
- 一个类最多只能有一个直接父类,包括抽象类,一个类可以实现多个接口
6.6 接口UML图
# 构造:长方形垂直分层三层[从上到下]
- 第一层:名字层,接口名字必须斜体字形,用<
- 第二层:常量层,常量列表,格式“常量名字:类型”
- 第三层:方法层,方法列表,格式“方法名字(参数列表):返回值类型”
# 使用 [一个类实现一个接口]
- 虚线连接类和它实现的接口
- 虚线起始端为类,终止端为接口,终止端使用空心三角形表示虚线的结束
6.7 接口回调
# 接口变量
- 接口也是Java中的一种数据类型,使用接口声明的变量作为接口变量
- 接口变量属于引用类型。
- 接口变量中可以存放实现该接口的类的实例的引用,即存放对象的引用
# 接口回调
- 把实现某一接口的类多创建的对象的引用 赋值给该接口声明的接口变量
那么该接口变量就可以调用被类实现的接口方法
- 当接口变量调用被类实现的接口方法时,就是通知相应的对象调用这个方法
# 代码示例
public interface People{
void Say(String s);
}
public class Teacher implements People{
public void Say(String s){
System.out.println(s);
}
}
public class Student implements People{
public void Say(String s){
System.out.println(s);
}
}
public calss app{
public static void main(String[] args){
People tea;
tea = new Teacher();
tea.Say("老师");
tea = new Student();
tea.Say("学生");
}
}
6.8 接口多态
- 指不同的类在实现同一个接口的时候可能具有不用的表现方式
6.9 接口参数
- 如果一个方法的参数是接口类型的参数,
就可以将任何实现改接口的类的实例的引用传递给该接口参数
那么接口参数就可以回调类实现的接口参数
6.10 面向接口编程
# 使用接口来约束类的行为,并为类和类之间的通信建立实施标准
# 使用面向接口编程增加了程序的可维护性和可扩展性
- 可维护性:当子类功能被修改时,只要接口不发生变化,系统其它代码就不需要改动
- 可扩展性:如果子类增加其它功能,只需要子类实现其它接口即可
# 使用接口可以实现程序设计的“开-闭原则” [对扩展开放,对修改关闭]