标记接口是无方法的public interface,类需显式implements,运行时用instanceof高效安全识别;不可用继承、注解或反射替代。

标记接口本身不提供任何方法,它的作用就是“打标签”——让代码在运行时能识别某类对象具备某种语义特征。用法核心就一条:定义空接口 + 类显式 implements + 运行时用 instanceof 判断。
怎么定义一个标记接口
语法极简,只要声明一个 public interface,里面不写任何方法、字段或默认方法:
- 必须是 public interface MyTag {}(不能是 default 或 private)
- 不能有方法声明,哪怕一个空的 void foo(); 都会让它失去“标记”意义
- 命名建议体现意图,比如 Loggable、Exportable、TransientCacheKey
怎么让类带上这个标签
不是继承、不是注解、不是配置,而是靠 显式 implements:
- class User implements Exportable { ... } ✅ 有效
- class Admin extends User { ... } ❌ 即使 User 实现了,Admin 也不自动继承该标记
- 用 @interface + 注解处理器 ❌ 那是注解,不是标记接口;JVM 不会把注解当类型看待
怎么在代码里识别和使用它
最常用、最直接的方式就是 instanceof,它在运行时查的是类的 implements 声明记录,高效且安全:
- if (obj instanceof Serializable) → JVM 看 obj 所属类是否在编译期写了 implements Serializable
- if (data instanceof Loggable) → 决定是否调用统一日志包装器
- null 安全:obj 为 null 时 instanceof 返回 false,不会 NPE
- 避免在高频循环里重复判断,可提前缓存结果,如 boolean canExport = item instanceof Exportable;
为什么不用反射替代
虽然也能用 obj.getClass().isInterface() 或遍历 getInterfaces(),但没必要:
- instanceof 更快:JVM 对它做了深度优化,是原生指令级支持
- 更安全:编译期就能检查接口是否存在,反射则可能 ClassNotFound 或 NoSuchMethod
- 语义更清晰:“这个对象是不是一种 XXX?” 比 “它有没有实现 XXX 接口?” 更贴近设计本意

















