Java中通过接口类型参数实现多态调用:方法声明接收接口参数,传入任意实现类对象,运行时动态绑定具体实现;如render(Drawable d)可处理Circle、Square等所有Drawable实现,无需类型判断或强转。

Java 中通过方法参数传递接口,是实现多态调用最常用、最标准的方式:方法声明接收接口类型参数,实际传入任意该接口的实现类对象,运行时自动调用对应实现的方法。
方法参数声明为接口类型
这是多态调用的前提。不要写具体实现类,而是用接口作为形参类型,这样方法才能“一视同仁”地处理所有实现者。
- 例如定义接口 Drawable:
public interface Drawable { void draw(); } - 两个实现类:
Circle implements Drawable和Square implements Drawable - 方法写成:
public void render(Drawable d) { d.draw(); }—— 参数是接口,不是 Circle 或 Square
调用时传入任意实现类实例
只要对象实现了该接口,就能直接传入。JVM 在运行时根据实际对象类型决定调用哪个 draw() 方法,无需 if/else 判断类型。
-
render(new Circle());→ 执行Circle.draw() -
render(new Square());→ 执行Square.draw() - 甚至可以传匿名内部类或 lambda(若接口是函数式接口):
render(() -> System.out.println("Custom"));
配合集合统一处理多种实现
接口参数 + 泛型集合是典型应用场景。比如 List 可存 Circle、Square、Triangle 等不同对象,遍历时直接调用 draw() 即可。
Listshapes = Arrays.asList(new Circle(), new Square(), new Triangle()); -
for (Drawable s : shapes) s.draw();—— 每次调用都动态绑定到实际类型的方法 - 新增图形类只需实现
Drawable,原有遍历逻辑完全不用改
注意避免常见误区
多态依赖的是“编译时看引用类型,运行时看实际类型”。如果参数误写成具体类,就失去扩展性;如果在方法内强转,就破坏了多态初衷。
- ❌ 错误:
void render(Circle c)→ 只能处理 Circle,无法复用 - ❌ 错误:
void render(Object o) { if (o instanceof Circle) ... else if (o instanceof Square) ... }→ 手动类型判断,违背面向接口设计 - ✅ 正确:坚持接口参数 + 实现类传入 + 运行时动态绑定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











