13 接口
15.1 概述
接口:一种行为的规则,是行为的抽象。
定义和使用
接口用interface关键字定义:public interface intfName {}
接口不能实例化
接口和类之间是实现的关系,通过implements关键字表示:public class className implements intfName {}
接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
注意
接口和类的实现关系,可以是单实现,也可以是多实现。
实现类还可以继承一个类的同时实现多个接口。
15.2 细节
成员变量:只能是常量,默认修饰符public static final
构造方法:无
成员方法:只能是抽象方法,默认修饰符public abstract
15.3 接口和类的关系
类与类的关系
- 继承:只能单继承,不能多继承,但可以多层继承。
类与接口的关系
- 实现:可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
接口与接口的关系
- 继承:可以单继承,也可以多继承
15.4 新增方法
JDK8以后接口中新增的方法有默认方法、静态方法。JDK9以后新增的方法有私有方法。
15.4.1 默认方法
默认方法:用关键字default修饰。
作用:解决接口升级的问题(不必强制重写)。
定义:public default retType methodName(paraList){}
注意
默认方法不是抽象方法,不被强制重写,重写时去掉default关键字。
public可省,default不可省。
实现多个接口时,存在同名默认方法,必须重写。
15.4.2 静态方法
静态方法:用关键字static修饰。
- 定义:public static retType methodName(paraList){}
注意
静态方法只能通过接口名调用,不能通过实现类或对象调用。
public可省,static不可省。
15.4.3 私有方法
私有方法:将多个方法中的共性抽取到新的方法,同时该方法只允许内部访问。用关键字private修饰。
定义:
默认:private retType methodName(paraList){}
静态:private static retType methodName(paraList){}
15.5 接口多态
当一个方法的参数是接口时,可以传递接口所有实现类的对象,这种方式称为接口多态。
15.6 适配器设计模式
适配器设计模式
- 当一个接口中抽象方法过多,但是我只要使用其中一部分的时候,就可以采用适配器设计模式。
书写步骤
编写中间类XXXAdapter,实现对应的接口;
对接口中某些抽象方法进行空实现(方法体为空);
让真正的实现类继承中间类,并重写需要的方法。
注意
- 为了避免其他类创建适配器类的对象,中间的适配器类用abstract进行修饰。
15.6 接口与抽象类的关系
相同点
不能实例化
子类实现抽象类或接口的方法后才可以实例化
不同点
抽象类抽象方法修饰符只能为public和protected,默认public;接口方法修饰符默认public修饰。
抽象类成员变量默认default,可在子类中重新定义或重新赋值;接口成员变量默认public static final,必须初赋值,不能二次修改。
继承抽象类关键字为extends;实现接口关键字为implements。一个类只能继承一个抽象类,但可以实现多个接口(间接实现多重继承)。
抽象类强调所属关系;接口强调特定功能的实现。
抽象类成员方法、构造方法都可以实现,但不能实例化,构造方法只用于子类调用;接口只有成员方法定义(JDK1.8中可以定义default方法体)。
抽象类
- 用于继承和实现多态。
接口
一般情况下,实现类和它的抽象类之前具有 "is-a" 的关系,但是如果我们想达到同样的目的,但是又不存在这种关系时,使用接口。
由于 Java 中单继承的特性,导致一个类只能继承一个类,但是可以实现一个或多个接口,此时可以使用接口。