Java接口是引用类型,代表“能力契约”,不可实例化但可声明变量、作参数/返回值/集合元素;支持多态调用、依赖倒置、泛型集合存储及回调机制。

Java 接口是引用类型,但它不表示具体对象,而是代表一种“能力契约”或“行为约定”。它本身不能被 new 出来,但可以声明变量、作为参数、返回值、集合元素类型——这些正是它作为引用类型落地的关键场景。
接口变量声明与多态调用
接口名可直接用于声明变量,该变量指向实现了该接口的任意具体对象。这是面向接口编程最基础也最核心的体现。
- 声明方式如:Runnable r = new Thread(() -> System.out.println("run"));
- 变量类型是接口(Runnable),实际持有子类或 lambda 构造的对象,运行时调用的是实现类的方法
- 同一接口变量可先后指向不同实现,比如 List<String> list = new ArrayList<>(); 后再赋值为 list = new LinkedList<>();,调用逻辑不变
方法参数和返回值类型
把接口作为形参或返回类型,能屏蔽具体实现细节,让方法更通用、更易扩展。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:一个日志服务方法定义为 void log(Loggable data),只要传入实现了 Loggable 接口的对象即可,无需关心它是 User 还是 Order
- 返回接口而非具体类(如 Collection<String> getItems())使调用方只依赖契约,内部可自由切换 ArrayList/HashSet/TreeSet 等实现
- 这种写法天然支持依赖倒置原则:高层模块不依赖低层模块,二者都依赖抽象(接口)
集合与容器中存储接口类型
泛型集合常以接口为类型参数,既保证类型安全,又保留运行时灵活性。
立即学习“Java免费学习笔记(深入)”;
- List<Comparable> comparables = new ArrayList<>(); 可添加 String、Integer、自定义类等任意实现 Comparable 的对象
- 配合 Stream API 使用时尤为明显,如 stream.map(Function::apply) 中的 Function 就是函数式接口,编译期检查、运行时动态绑定
- 避免在集合里混用具体类,防止后续替换实现时大量修改代码
回调与事件监听机制
接口作为引用类型,是实现回调逻辑的自然载体——系统持有一个接口引用,在合适时机调用其方法。
- Android 中 View.setOnClickListener(new OnClickListener() {...}),OnClickListener 是接口,系统在点击发生时调用其 onClick() 方法
- Swing/AWT 的 ActionListener、NIO 的 CompletionHandler<V, A> 都是典型例子
- 这种模式解耦了触发者与响应者,响应逻辑由使用者提供,触发逻辑由框架控制

















