3.6 接口
3.6.1 定义
官方解释是一系列方法特征的集合, 在jdk1.8之前可以理解为一个纯粹的抽象类, 只包含静态常量和方法的定义, 没有方法的实现.
- 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。
- 一个接口就是描述一种能力
- 比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作.
- 例如java中的接口Comparator, 这个接口代表“进行比较”的能力, 所以任何实现这个接口的类都具备了比较的能力, 可以用来进行排序操作.
3.6.2 作用
- java中没有多继承, 所以可以用接口实现多继承的逻辑.
- 实现解耦.
3.6.3 接口语法
//接口定义的语法要用到interface关键字
//[修饰符] interface 接口名 {}
public interface Animal {
//在接口中, 不能只声明变量,必须要初始化
//接口中存在的变量, 一定是静态常量,默认被public static final修饰着
int num = 10;
public static final int count = 11;
//接口方法 不能有方法体, 且子类必须实现该接口方法
void eat();
// public abstract void eat();
//默认方法 可以有方法体, 子类可以选择性的实现默认方法 //public可省略
public default void test1(){
System.out.println("test1");
}
//静态方法 可以有方法体, 使用时必须用接口名调用 //public可省略
public static void test2(){
System.out.println("接口中的静态方法");
}
}
3.6.4 接口特点
-
接口是隐式抽象, 声明时不必使用abstract关键字
//隐式抽象 默认是由abstract修饰的 public interface Animal{} //上边和下边,两者等价 public abstract interface Animal {}
-
声明的方法也是隐式抽象
//两者等价 void eat(); public abstract void eat();
-
接口中存在的变量, 一定是静态常量,默认被public static final修饰着
-
接口不能实例化对象, 但能声明引用(用于多态)
-
一个类只能继承一个父类, 但能实现多个接口.
-
接口能继承多个接口.
-
接口用来弥补类无法实现多继承的局限.
-
接口与实现类中存在多态关系
3.6.5 接口和抽象类的区别
- 接口中存在的属性都是静态常量, 抽象类中可以有普通的非final属性变量
- 接口中不能有构造方法, 抽象类中可以有构造方法.
- 接口不能包含静态方法.
- 共同点都不能用来创建对象.
接口 | 抽象类 |
---|---|
接口中存在的属性都是静态常量 | 可以有普通的非final属性变量 |
接口中不能有构造方法 | 抽象类中可以有构造方法 |
接口不能包含静态方法. | 抽象类可以包含任意种类的方法 |
都不能用来创建对象. | 都不能用来创建对象. |
3.6.6 面向接口编程
只关心类有哪些能力 , 不去关心具体的实现细节
现实生活中,当我们想用某个设备去读取或写入电脑中的数据时, 就不可避免的会用USB接口,将设备与电脑联系起来.
这样,我们就可以吧USB看做一个接口, 任何带有USB接口的设备都具有读和写的能力.
public interface USB {
//该接口有两个能力, 分别是读和写
//任何实现了该接口的类都具备了这两种能力
//当然USB可能会有更多的能力,比如说充电等等
void read();
void write();
}
然后在制造U盘时, 实现这个接口
public class UPan implements USB{
@Override
public void read() {
System.out.println("U盘正在使用USB接口的'读'能力");
}
@Override
public void write() {
System.out.println("U盘正在使用USB接口的'写'能力");
}
}
测试
public static void main(String[] args) {
UPan u = new UPan();
u.read(); //U盘正在使用USB接口的'读'能力
u.write();//U盘正在使用USB接口的'写'能力
}