static 关键字使类成员属于类本身而非实例,所有对象共享同一份 static 变量(存于元空间),static 方法无需实例即可调用但只能访问 static 成员,static 块在类加载时执行一次用于初始化共享资源;需注意 static 共享不保证线程安全,多线程修改需同步控制。

Java 中 static 关键字让类成员(变量或方法)属于类本身,而非某个具体对象实例。因此,所有实例共享同一份 static 成员,天然实现多实例间的数据共享。
static 变量:多个对象共用同一内存地址
被 static 修饰的字段在类加载时初始化一次,存储在方法区(JDK 8+ 为元空间),整个 JVM 中仅有一份副本。无论创建多少个对象,访问的都是同一个变量。
- 适合存放全局配置、计数器、缓存容器等跨实例一致的数据
- 注意线程安全:多个线程同时读写 static 变量时需加同步控制(如 synchronized 或 AtomicInteger)
- 示例:统计已创建的对象数量
static int count = 0;
Counter() { count++; }
static int getCount() { return count; }
}
static 方法:无需实例即可调用,操作共享资源
static 方法只能直接访问 static 成员(包括 static 变量和其他 static 方法),不能使用 this 或非 static 字段。它常用于工具逻辑或对共享资源的统一管理。
- 例如:提供获取/重置共享缓存、初始化静态配置、生成唯一 ID 等功能
- 避免在 static 方法中依赖实例状态,否则会破坏共享语义或引发空指针
static 块:控制共享资源的初始化时机
static 初始化块在类首次加载时执行且仅执行一次,适合做一次性资源准备(如加载配置、初始化连接池、预热缓存)。
- 多个 static 块按代码顺序执行
- 若初始化失败(抛出异常),类加载中断,后续无法使用该类
- 与 static 变量声明结合,可确保共享资源在任何实例创建前就绪
注意事项:共享不等于线程安全
static 实现的是“可见性共享”,但不是“并发安全”。多个线程同时修改 static 变量可能造成数据错乱。
- 简单场景可用 volatile(仅保证可见性,不保证原子性)
- 计数类操作推荐 AtomicInteger 等原子类
- 复杂逻辑建议用 synchronized、ReentrantLock 或并发集合(如 ConcurrentHashMap)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











