java 中接口作为方法参数时,调用方只需传入实现了该接口的类实例即可。具体做法是在定义方法时将参数类型声明为接口名,并在调用时传递具体的实现对象。这样做的好处是解耦了方法与具体实现类的依赖,使得代码更加灵活且易于扩展。

如何定义和使用接口参数
定义方法时直接指定接口类型为参数,调用时传入实现类对象。例如定义一个接受 Runnable 的方法,调用时传入匿名内部类或 Lambda 表达式。这允许方法在不关心具体实现的情况下执行特定逻辑。

public class Main {
public static void execute(Runnable task) {
task.run();
}
public static void main(String[] args) {
// 使用 Lambda 表达式作为参数
execute(() -> System.out.println("Task executed"));
// 使用匿名内部类作为参数
execute(new Runnable() {
@Override
public void run() {
System.out.println("Anonymous task executed");
}
});
}
}
预期结果:控制台依次打印 "Task executed" 和 "Anonymous task executed"。
接口参数与多态的关系
接口作为参数体现了多态性,即同一个方法可以处理不同实现类的行为。当多个类实现同一接口时,方法可以统一处理这些对象,无需针对每个类编写重载方法。这种设计模式在策略模式中非常常见,允许运行时动态选择算法。

interface Strategy {
int calculate(int a, int b);
}
class AddStrategy implements Strategy {
public int calculate(int a, int b) { return a + b; }
}
class MultiplyStrategy implements Strategy {
public int calculate(int a, int b) { return a * b; }
}
public class Calculator {
public static int perform(Strategy strategy, int x, int y) {
return strategy.calculate(x, y);
}
public static void main(String[] args) {
System.out.println(perform(new AddStrategy(), 5, 3)); // 输出 8
System.out.println(perform(new MultiplyStrategy(), 5, 3)); // 输出 15
}
}
预期结果:控制台依次打印 "8" 和 "15"。
如果接口包含默认方法会怎样
如果接口中包含默认方法(default method),实现类可以选择性地覆盖它或不覆盖。当接口作为参数传递时,方法可以调用默认方法或覆盖后的方法,具体行为取决于传入对象的实际类型。默认方法提供了向后兼容的机制,允许在现有接口中添加新方法而不破坏已有实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











