static 关键字使变量或方法绑定类本身而非实例:static 变量被所有实例共享,需注意线程安全;static 方法无 this、不可重写、常用于工具类;static 代码块在类加载时执行一次;static 内部类不持外部类引用,可直接实例化。

static 关键字让变量或方法脱离单个对象的生命周期,直接绑定到类本身——它不依赖 new 出来的实例,而是随类加载而存在,随类卸载而消失。
static 变量:共享状态,跨实例一致
被 static 修饰的字段属于类,所有实例共享同一份内存空间。修改任一实例访问的 static 变量,其他实例读取时立即可见。
- 适合存储全局配置、计数器、缓存等无需每对象独立维护的数据
- 注意线程安全:多个线程同时读写 static 变量时,需加同步(如 synchronized 或 AtomicInteger)
- 避免滥用:把本该属于对象状态的字段设为 static,会导致逻辑错乱(比如把 person.name 设成 static,所有人名字就变成同一个)
static 方法:无 this 引用,仅操作静态上下文
static 方法不能访问非 static 成员(因为没有隐式 this),只能调用其他 static 方法、访问 static 变量,或处理传入的参数。
- 常用于工具类(如 Math.abs()、Collections.sort()),不依赖对象状态的纯逻辑封装
- 无法被重写(override),但可被隐藏(hiding):子类定义同名 static 方法,只是覆盖了可见性,并非多态
- 构造器不能是 static,但可以用 static 工厂方法替代 new(如 LocalDate.now())
static 代码块:类加载时执行一次的初始化逻辑
static {} 块在类首次被加载(如第一次 new、调用 static 方法、访问 static 字段)时执行,且仅执行一次。
立即学习“Java免费学习笔记(深入)”;
- 适合做一次性资源准备:初始化静态集合、加载配置、注册驱动等
- 多个 static 块按源码顺序执行;父类 static 块先于子类执行
- 若抛出异常,类加载失败,后续对该类的任何引用都会触发 NoClassDefFoundError
static 内部类:轻量级嵌套,不持外部类引用
static 修饰的内部类本质是独立类,只是命名空间在外部类内,不隐式持有外部类实例引用。
- 节省内存:避免因持有外部 this 导致外部对象无法被 GC
- 可直接通过 OuterClass.StaticInner 实例化,无需外部类实例
- 不能访问外部类的非 static 成员(没有 this 指向)
static 是管理类级别状态的核心机制,用对了能提升复用与性能,用错了容易引发并发问题或状态污染。关键在于分清“属于类”还是“属于对象”。


















