接口
在Java中,接口使用interface关键字声明,类使用implements来实现接口
声明
在接口里,通常只声明方法,不写具体实现,但从Java8开始,接口开始也支持default方法和static方法
java
public interface Connection {
// 接口中的变量默认都是:public static final(全局常量),写不写这三个词都一样
String TYPE = "Type-C";
// 接口中的方法默认都是:public abstract(抽象方法),不能有方法体
void connect();
void transferData();
}实现
一个类如果实现了某个接口,就必须实现(重写)该接口中定义的所有抽象方法,否则这个类就必须声明为抽象类
java
// 键盘类实现了 Connection 接口
public class Keyboard implements Connection {
@Override
public void connect() {
System.out.println("键盘已连接");
}
@Override
public void transferData() {
System.out.println("正在传输数据");
}
}为什么要用接口
有了继承,为什么还要接口
- 弥补了Java单继承的缺陷
比如:Dog继承了Animal,它就不能再继承Robot(机器人)了
但是,一个类可以实现多个接口
java
// 电子狗既是动物(继承),又具有电子设备和宠物属性(多接口实现)
public class RoboticDog extends Animal implements Electronic, Pet {
// 完美融合!
}- 彻底的解耦
接口把规范和具体实现彻底分开了
比如,你写了一个电脑类Computer,它需要连接设备
java
public class Computer {
// 电脑只认 Connection 接口,不认具体的设备
public void plugin(Connection device) {
System.out.println("发现新设备...");
device.connect();
device.transferData();
}
}有了接口,无论以后市场上出现什么奇形怪状的 USB 设备(比如 USB 加湿器、USB 暖手宝),你的 Computer 类一行代码都不需要改!只要新设备实现了 Connection 接口,电脑就能直接用。
默认方法
接口提供一个默认实现。子类可以直接继承使用,不用强制重写
java
public interface Connection {
void connect();
// 新增一个默认方法,带花括号和具体实现
default void charge() {
System.out.println("正在通过接口进行慢速充电(默认 5V 1A)...");
}
}静态方法
接口也可以写静态方法,直接用接口名.方法名()调用,通常用于提供工具类性质的辅助方法
java
public interface Connection {
static boolean isValidType(String type) {
return "Type-C".equalsIgnoreCase(type) || "Micro-USB".equalsIgnoreCase(type);
}
}