基本概念
接口interface接口定义的是规范与标准,不管具体的实现,便于设计与实现分离,也就是说接口全面实现了规范和具体实现的分离
普通类 | 抽象类 | 接口 |
---|---|---|
具体实现 | 具体实现,规范(抽象方法) | 规范(jdk8后也可有普通方法) |
声明格式
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义;
方法定义;
}
使用说明
- 子类使用implements来实现接口中的规范
- 接口不能创建实例,但是可用于声明引用变量类型
- 一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
- jdk1.8(不含8)之前,接口中只能包含静态常量、抽象方法,不能有普通属性、构造方法、普通方法
- jdk1.8(含8)之后,接口中包含普通的静态方法、默认方法
接口的新特性
接口的过于严格的特性,产生了一些开发问题,例如已经写好的接口被多个类实现,如果需要修改接口,那么这些类均需要同步更新,实现新增抽象方法,所以jdk8以后,允许接口可以定义具体的方法,使得接口更加灵活、扩展性更强
默认方法
- 默认方法使用default关键字,一个接口可以定义多个默认方法。默认方法也叫扩展方法
- 子类实现接口时,可以直接调用接口中的默认方法,也可以重写
当修改了接口后,已经实现的类不需要进行任何改动,新增类去调用修改的扩展方法即可
静态方法
- 接口中同时还可以定义静态方法,静态方法通过接口名调用
如果实现类中定义了相同名字的静态方法,那就是完全不同的方法,直接从属于实现类,通过类名直接调用
命名冲突问题解决
当方法名称以及形参列表相同时候,会发生命名冲突,采取以下解决方法(例如某个实现类继承自父类的方法与实现的接口的默认方法形成冲突,某个实现类实现了多个接口产生冲突等)
父类优先。如果父类的方法和默认方法名冲突,则父类优先
接口冲突。如果多个接口中默认方法有相同的名字,则子类必须实现重写冲突的同名方法
代码示例
```java interface A1 {
default void moren1(){
System.out.println("A1.moren1");
}
default void moren2(){
System.out.println("A1.moren2");
}
static void staticMethod(){
System.out.println("A1.staticMethod");
}
}
```