一、首先接口是什么?
Java 接口(interface)是一种引用数据类型,它定义了一组行为规范,而不实现具体的逻辑。类通过 implements 关键字实现接口,从而承诺具备接口中定义的功能。
✅ 1.1 接口的基本语法 -> interface关键字
public interface Animal {
void makeSound(); // 默认是 public abstract
}
实现接口的类:
public class Dog implements Animal {
public void makeSound() {
System.out.println("汪汪汪");
}
}
二、接口的特点与作用
| 特性 | 说明 |
|---|---|
| ✅ 不能被实例化 | 接口不能 new,只能被实现 |
| ✅ 多实现 | 一个类可以实现多个接口 |
| ✅ 行为规范 | 接口不实现行为,只定义行为 |
| ✅ 解耦合设计 | 代码依赖于接口而不是实现 |
| ✅ 支持多继承 | 接口之间可以多继承 |
三、接口的优势(为什么要用接口)
✅ 3.1 提高代码灵活性和可扩展性
接口允许不同类实现相同功能,便于替换和扩展。
public interface Payment {
void pay();
}
public class Alipay implements Payment {
public void pay() {
System.out.println("支付宝支付");
}
}
public class WeChatPay implements Payment {
public void pay() {
System.out.println("微信支付");
}
}
调用方只依赖接口:
public void doCheckout(Payment payment) {
payment.pay(); // 无需关心具体实现
}
✅ 3.2 支持策略模式、回调机制等设计模式
接口是许多经典设计模式(如策略模式、模板方法、适配器模式)的基础,提升程序架构性。
四、接口的新特性(Java 8 及之后)
Java 8 对接口做了重大的增强,使其具备部分“类”的特性:
🔸 4.1 默认方法(default)
接口可以拥有带有默认实现的方法。
public interface Logger {
default void log(String msg) {
System.out.println("日志:" + msg);
}
}
实现类可选择重写或使用默认实现。
🔸 4.2 静态方法(static)
接口可以定义工具方法。
public interface MathUtil {
static int square(int x) {
return x * x;
}
}
调用:
int s = MathUtil.square(5);
🔸 4.3 私有方法(Java 9+)
用于内部重用逻辑。
public interface Service {
private void helper() {
System.out.println("内部私有逻辑");
}
default void doWork() {
helper();
}
}
五、接口 vs 抽象类
| 对比项 | 接口 | 抽象类 |
|---|---|---|
| 实例化 | ❌ | ❌ |
| 构造函数 | ❌ | ✅ |
| 继承 | 可多实现 | 只能单继承 |
| 变量 | public static final 常量 | 任意类型 |
| 方法 | 默认 public abstract,支持 default/static | 可包含具体/抽象方法 |
| 应用场景 | 行为能力的约定 | 模板结构与基本行为 |
✅ 抽象类:强调“是什么”;接口:强调“能做什么”。接口强调能力(what it can do),抽象类强调本质(what it is)。
六、接口的实际开发场景
🔧 6.1 Spring 服务层接口
public interface UserService {
User getById(Long id);
}
实现类:
@Service
public class UserServiceImpl implements UserService {
@Override
public User getById(Long id) {
// 调用数据库
return userMapper.find(id);
}
}
🔧 6.2 Lambda 表达式 + 函数式接口
Java 8 的函数式接口(只包含一个抽象方法)常配合 Lambda 使用:
@FunctionalInterface
public interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> toInt = s -> Integer.parseInt(s);
System.out.println(toInt.convert("123")); // 输出:123
七、接口使用注意事项
| ⚠️ 项目 | 建议 |
|---|---|
| 不要在接口中定义状态 | 除非是常量 |
| 实现类必须实现所有抽象方法 | 否则必须声明为抽象类 |
| 尽量面向接口编程 | 提高扩展性与可维护性 |
| default 方法避免滥用 | 以防接口职责过重 |
接口方法默认 public abstract | 实现类需使用 public |
✅ 总结
-
接口是 Java 中实现解耦、抽象化、多态性的核心工具;
-
Java 8+ 给接口赋予了更强的表达能力(default、static 方法);
-
实际开发中,推荐优先使用接口定义服务、策略、规范;
-
理解接口 = 理解面向对象中的“能力建模”。

2693

被折叠的 条评论
为什么被折叠?



