java中接口作为参数传递是面向接口编程的核心实践,即方法形参声明为接口类型而非具体实现类,从而实现解耦、扩展和测试友好。

Java 中接口作为参数传递,是面向接口编程的核心实践——不是传具体类,而是传接口类型,让调用方只依赖抽象,不依赖实现。
接口作形参:方法签名里写接口,不写具体类
定义方法时,参数类型直接声明为接口,而非某个实现类。这样方法就能接收任意该接口的实现对象。
- 例如:void processPayment(PaymentProcessor processor) —— 参数是
PaymentProcessor接口,不是AlipayProcessor或WechatProcessor - 调用时可传入任何实现了
PaymentProcessor的对象:processPayment(new AlipayProcessor())或processPayment(new WechatProcessor()) - 方法内部只调用
processor.pay(amount),完全不知道也不需要知道背后是哪个类
解耦与扩展:新增支付方式无需改原有方法
当业务要支持新支付渠道(比如 Apple Pay),只需新增一个实现类,实现相同接口,其他代码零修改。
- 原来的方法、测试、调用链都不动,只要新类符合接口契约即可接入
- 避免了 if-else 判断具体类型,也规避了因修改已有逻辑引入的风险
- 利于单元测试:可传入 Mock 实现或 Stub,隔离外部依赖
结合策略模式:运行时动态选择行为
把不同算法/行为封装成接口实现,通过参数传入,让同一方法表现出不同逻辑。
- 比如排序方法:
void sort(List<integer> data, Comparator<integer> comparator)</integer></integer> - 调用时可传
Integer::compareTo、(a,b) -> b - a或自定义比较器,行为由传入的接口实例决定 - 核心逻辑(排序流程)不变,变化的部分(怎么比)交给接口实现者
注意点:接口不能 new,但可通过 lambda 或匿名类快速实现
接口本身不能实例化,但 Java 支持简洁方式创建实现对象,方便测试或简单场景。
- lambda(适用于函数式接口):
processPayment(amount -> System.out.println("Mock payment: " + amount)) - 匿名内部类:
new PaymentProcessor() { public void pay(double a) { ... } } - 务必确保传入对象真正实现了接口全部方法,否则编译不通过
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











