Java:接口
接口
1.Java接口是抽象方法的集合,其定义语法为:
访问权限控制符 interface 接口名 [extends 接口列表] {
常量;
抽象方法;
内部类;
}
注:
访问权限控制符:该访问控制符只有两个:public和友好的。
接口名: 接口名的命名规则和类名的命名规则相同。
2.接口内只能包含常量(public static final)、抽象方法及内部类。
3.接口中的抽象方法必须为public访问权限控制符,不能为其它控制符。
4.通过extends关键字可以使自定义的接口实现继承,但需要注意以下两点:
⑴接口只能继承父接口,不能继承抽象类和普通类。
⑵接口弥补了Java单一继承的缺点(Java中的类只能继承一个父类),即接口可以继承多个父接口,它们之间用英文逗号隔开。
接口实现
1.类通过implements关键字实现接口,Java中的类只能是单继承,但却可以实现多个接口以弥补Java类单继承的不足,其语法如下:
访问控制符 修饰符 class 类名 implements 接口1 [,接口2, ……] {
变量;
方法;
}
注意:在类中实现接口时,实现类中方法的名字、返回值类型、参数的个数及参数数据类型必须与接口中的对应的抽象方法完全一致。
2.如果一个类实现了一个接口,但没有实现接口中的所有抽象方法,那么这个类必须是abstract类。
3.如果多个接口中定义了相同的抽象方法,则在实现类中只实现其中一个即可;
接口回调
1.接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法。
IFelidae.java文件中的代码:
Lion.java文件中的代码 :
2.接口没有构造方法,不能创建自己的对象,但是可以引用实现类的对象。
3.接口实现类可以直接使用接口中的常量:
4.接口实现类所实现的多个接口中有常量名相同的常量,则在实现类中不能直接使用,必须使用类名来确定到底调用哪个接口中的常量:
注 :必须指定调用哪个接口中的常量
默认方法
Java8以前版本中规定,接口中所定义的方法只能是抽象方法,从Java8开始,接口中可以添加一个或多个由default关键字修饰的非抽象方法,该方法又称为扩展方法,该默认方法将由接口实现类创建的对象来调用,如下例:
静态方法
同样,从Java8开始,接口中可以添加一个或多个由static关键字修饰的非抽象方法,该方法将由接口或其实现类直接调用,如下例:
函数式接口
如果接口内只定义一个抽象方法,则该接口称为函数式接口,如下例:
注意:
- 可以使用@FunctionalInterface 注解来验证一个接口是不是函数式接口,Java8中java.lang.Runnable、java.util.Comparator<T>都是函数式接口;
- 函数式接口中可以定义多个常量、多个默认方法和多个静态方法,但只能定义一个抽象方法及多个java.lang.Object中的public方法,如下例:
抽象类与接口区别:
|
抽象类 |
接口 |
关键字 |
abstract |
Interface |
成员变量 |
可包含任意合法成员变量(包括各种访问级别的类成员变量和实例成员变量) |
只能包含公开静态常量(默认由public static final修饰) |
构造方法 |
有构造方法 |
无构造方法 |
方法 |
可包含任意合法方法(包括各种访问级别的非抽象类方法和非抽象实例方法,也包含除private外的非静态抽象方法) |
JDK7及其以下版本JDK只能包含公开且抽象的方法(默认由public abstract修饰),而JDK8开始可以包含default、static修饰的非抽象方法。 |
如何实现抽象方法 |
通过自定义类继承抽象类的方式实现抽象类的抽象方法 |
通过自定义类implements接口实现接口中的抽象方法,定义类可以implements多个接口 |
是否存在多继承 |
一个抽象类只能继承一个抽象或非抽象类 |
一个接口可以继承多个接口 |