java接口中变量默认为public static final,因接口是契约规范不描述状态:public确保公开访问,static因接口不可实例化,final保证规则不可变;声明时必须初始化,本质是编译期常量。

Java 接口中定义的变量默认是 public static final。
为什么只能是 public static final?
接口本质是一组规范或契约,不描述状态,只声明能力。所以它不允许存在可变的、与实例相关的数据:
- public:确保所有实现类和外部代码都能直接访问该常量,符合“公开约定”的设计意图
- static:接口不能被实例化,没有对象概念,变量必须属于接口类型本身,随类加载而存在
-
final:接口中的变量代表不变的规则(如
MAX_RETRY = 3),禁止被任何实现类修改,否则契约就失效了
写法上可以省略修饰符
你写成这样完全合法,编译器会自动补全:
interface Config {
String VERSION = "2.1.0"; // 等价于 public static final String VERSION = "2.1.0";
int TIMEOUT_MS = 5000; // 等价于 public static final int TIMEOUT_MS = 5000;
}
但不能写成:private int count;、String name;(缺 final)、static String desc;(缺 final 和 public)——这些都会编译报错。
它不是“变量”,而是常量
接口中定义的所谓“变量”,实际是编译期常量,必须在声明时初始化,且无法重新赋值:
- 不能在实现类中通过
Config.VERSION = "3.0"修改(编译不通过) - 不能在构造方法、实例块或普通方法里动态赋值
- 如果需要可变状态,应放在实现类内部,而不是接口里
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











