static修饰的变量属于类本身,所有实例共享同一份内存空间,类加载时初始化且生命周期贯穿整个程序运行期;可通过“类名.变量名”直接访问,不可用this或super引用;初始化按代码顺序执行,适合存储全局配置、计数器等,但需注意线程安全与内存泄漏风险。

static修饰的变量属于类本身,而不是某个具体对象,所有实例共享同一份内存空间。 它在类加载时初始化,生命周期贯穿整个程序运行期,是理解Java内存模型和工具类设计的关键基础。
静态变量的声明与访问方式
用static关键字修饰成员变量即可声明为静态变量。它不依赖对象存在,可通过“类名.变量名”直接访问,无需创建实例。
- 推荐使用类名.变量名的方式调用,语义清晰且避免歧义
- 虽然也能通过对象引用访问(如obj.staticVar),但编译器会自动转为类级别调用,容易误导初学者以为它属于该对象
- 静态变量不能用this或super引用,因为它们与实例无关
静态变量的初始化时机与顺序
静态变量在类第一次被主动使用(如首次new对象、调用静态方法、访问静态字段等)时触发类加载,随后执行静态变量初始化和静态代码块。
- 按代码中出现的顺序从上到下执行:先声明并赋值,再执行静态代码块
- 若静态变量依赖另一个静态变量,后者必须已声明(可未赋值),否则编译报错
- 例如:static int a = b + 1; 和 static int b = 5; 是合法的;反过来则编译失败
静态变量的常见用途与注意事项
静态变量适合存储全局配置、计数器、缓存对象、工具类常量等跨实例共享的数据。
立即学习“Java免费学习笔记(深入)”;
- 配合final使用可定义常量(如public static final String VERSION = "1.0";)
- 非final静态变量要注意线程安全:多个线程同时修改可能引发数据不一致,必要时加同步控制
- 避免过度使用:静态变量延长对象生命周期,可能导致内存泄漏(如持有Activity、Context等引用)
- 类卸载时静态变量才会被回收,而普通Java应用中类通常不会卸载










