一、接口的本质:行为契约
接口(interface)定义了一组方法签名(没有具体实现),作为类必须遵守的契约:
// 定义“可支付”契约
public interface Payable {
void pay(double amount); // 抽象方法,无实现体
}
实现类(implements)必须履行契约,提供具体实现:
public class CreditCardPayment implements Payable {
@Override
public void pay(double amount) {
System.out.println("信用卡支付:" + amount + "元");
}
}
二、Java 8接口革命:突破性进化
1. Default方法 - 接口的默认实现
解决接口演进难题:向老接口添加新方法时,不强制所有实现类立即修改。
public interface Payable {
void pay(double amount);
// Default方法:提供默认实现
default String getPaymentMethod() {
return "未知支付方式";
}
}
// 实现类无需重写getPaymentMethod()也能工作
CreditCardPayment card = new CreditCardPayment();
card.pay(100.0);
System.out.println(card.getPaymentMethod()); // 输出:未知支付方式
2. Static方法 - 接口的工具箱
直接在接口内封装相关工具方法:
public interface Payable {
// ... 其他方法 ...
static boolean validateAmount(double amount) {
return amount > 0;
}
}
// 通过接口名直接调用
boolean valid = Payable.validateAmount(50); // true
三、函数式接口:Lambda的基石
只包含一个抽象方法的接口,可用@FunctionalInterface注解标记,支持Lambda表达式:
@FunctionalInterface
public interface Calculator {
int calculate(int a, int b);
}
// Lambda实现接口
Calculator add = (x, y) -> x + y;
System.out.println(add.calculate(3, 5)); // 输出:8
Calculator multiply = (x, y) -> x * y;
System.out.println(multiply.calculate(3, 5)); // 输出:15
四、接口 vs 抽象类:关键差异
特性 接口(interface) 抽象类(abstract class)
方法类型 抽象+default+static 抽象+具体方法
变量 默认public static final 任意成员变量
构造器 无 有
多继承 一个类可实现多个接口 一个类只能继承一个父类
设计目标 行为契约 代码复用+部分实现
最佳实践:优先用接口定义行为,抽象类用于共享代码模板。接口的default方法模糊了界限,但核心定位未变。
接口已从单纯的行为规范,进化为融合规范、默认行为与工具方法的强大设计工具。其支持多继承的特性为系统提供了无与伦比的灵活性,而函数式接口与Lambda的结合,更让Java在函数式编程领域焕发新生。掌握接口的深度应用,是构建高扩展性、低耦合系统的关键一步。
1415

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



