接口—>interface—>类比抽象类—>接口不是类
- 一种标准、规范;接口的使用者和实现者都必须遵循的约定、规范
- 接口编译之后生成对应的 . class文件,文件名以接口名命名
- 接口不能创建对象,但可以声明引用
- 接口中没有静态代码块
- 接口中的属性都是公开的、静态、常量(默认被public、static、final修饰)—>接口中属性需要在定义 时对其初始化
- 接口中的方法默认公开、抽象的(public、abstract修饰)
- 接口中没有***构造方法***
- 接口不是类 ( 抽象类的进一步抽象 )
实现类—>implements
-
实现类可以成为抽象类或者覆盖 ( 实现 ) 接口中所有的方法,注意覆盖时访问修饰符
-
使用:接口引用指向子类对象—>多态
-
一个接口可以定义多个实现类
-
接口的继承
- Java中接口之间是多继承—>一个接口可以直接继承多个父接口
- Java中类和接口是多实现关系—>一个类可以同时实现多个接口
- Java中的类实现多个接口的同时还可以继承一个父类,但是必须先继承,后定义实现
-
接口的多继承使多态更加的复杂和多样性
-
如果强转双方有一方为接口类型,编译一定通过
-
若实际存储对象类型兼容于 ( 是不是它的一种 ) 要转换的类型,运行通过
-
若实际存储对象类型不兼容于要转换的类型,则编译通过,但运行报错
---->java.lang.ClassCastException(类型转换异常)
-
-
应用
- 因为Java中的类之间是单继承,所以当父类中的功能需求不足以满足子类能力需求时,可以借助接口指定能力标准用于扩充子类的能力需求
- 借助接口,将接口的使用者和实现者进行分离,同时利用多态,降低模块之间耦合度,从而实现代码弱耦合。
- 依赖倒转原则:一个类和另一个类建立联系时,尽可能和其父类或者接口建立联系,避免和子类或是实现类直接建立联系
- 提高代码的可维护性
- 实现弱耦合---->借助接口将接口实现者和接口使用者进行分离,借助多态降低各模块之间耦合度
接口回调
- 接口制定之后,接口的使用者已经被定义,编程人员根据接口的规则写出接口的实现
- 实现类目的:作为参数传递,让接口的使用者进行调用
- 一旦出现接口回调应用场景,编程人员只关注于如何根据接口的规则将实现写出,尽可能忽略应用者
高版本新增语法
- jdk8.0 开始,接口可以定义默认方法—>接口中方法的default不是访问修饰符,只代表此方法可以有实现部分,且只限于接口使用。只能基于实现类的对象来访问。实现类可以覆盖默认方法
interface IA{
public default 返回值类型 方法名(形参列表){ //public可以省略
//可以写方法实现
}
}
- jdk8.0 开始,接口可以定义静态方法—>接口名 . 静态方法名() 调用—>访问权限默认public ,可以带方法实现部分—>可以被static继承覆盖,没有多态
interface IA{
public static 返回值类型 方法名(形参列表){ //public可以省略
//可以写方法实现
}
}
- jdk9.0 开始,接口可以定义私有方法—>私有方法可以带有实现部分—>私有化方法,外界不能使用—>通常为自己内部做组件应用—>不能被继承
interface IA{
private 返回值类型 方法名(形参列表){
//可以写方法实现
}
}
接口分类—>应用需求
-
常量接口:
- 只有默认被public static final修饰的属性 ( 常量 ) ,没有定义任何方法的接口—>应用不广泛
-
标记接口:
- 接口中没有定义任何内容 ( 没有属性也没有方法 ) —>空接口—>IO流的对象序列化时应用
-
普通接口:
- 对接口中的属性和方法没有要求—>应用最广泛
-
函数式接口:
- 接口中有且只有一个抽象方法 ( 默认方法和静态方法不关注 ) —> 广泛应用在Lambda表达式中
-
接口和抽象类
抽象类 | 接口 | |
---|---|---|
关键字 | abstract | interface |
属性 | 实例变量、静态变量 | 默认 public static final |
方法 | 抽象方法和非抽象方法 | 默认 public abstract jdk8.0:默认方法和静态方法 jdk9.0:私有方法 |
构造方法 | 有,无参 | 无 |
继承 | 单继承 | 多继承 ( 接口和接口 ) 多实现 ( 接口和类 ) |