static关键字表示成员属于类而非实例,类加载时初始化且仅一次;static方法不能调用非static成员因无this上下文;static内部类不依赖外部类实例;static不保证线程安全或单例。

static 关键字不是“共享内存”或“全局变量”的快捷写法,而是明确告诉 JVM:这个成员属于类本身,不依赖任何实例。
static 变量什么时候初始化?
类加载时初始化,且仅一次。它不随 new 出多少个对象而重复创建。
- 初始化时机在
static块中(如果有),或直接赋值语句处;static块按代码顺序执行,早于构造方法 - 多个类继承时,父类
static块先于子类执行 - 如果类从未被主动使用(如未访问其静态成员、未 new 实例、未反射加载),JVM 可能延迟加载——
static变量也就不初始化 - 注意:反序列化不会触发
static变量重置,它的值来自当前 JVM 状态,不是对象状态的一部分
static 方法为什么不能调用非static成员?
因为 static 方法运行时可能根本没有 this——它不绑定到任何实例,而实例变量和实例方法必须通过具体对象才能定位。
- 编译器会直接报错:
non-static variable xxx cannot be referenced from a static context - 常见误操作:在
main方法里直接写name = "abc"(假设name是实例变量)→ 必须改成new MyClass().name = "abc"或声明为static String name -
static方法可以访问其他static成员,包括私有的(只要在同一个类内) - 不要试图在
static方法里用this或super——语法非法
static 修饰内部类意味着什么?
它让内部类脱离对外部类实例的隐式引用,变成“独立类”,可直接 new,无需外围类对象。
立即学习“Java免费学习笔记(深入)”;
- 普通内部类(无
static)编译后持有Outer this$0字段,强制依赖外部实例 -
static内部类不持引用,因此不能直接访问外部类的实例变量和方法(除非显式传入对象) - 常见用途:工具类嵌套(如
Collections.EmptyList)、Builder 模式中的静态子类 - 注意:即使加了
static,内部类默认仍不能访问外部类的 private 成员——除非通过 public getter 或包级访问控制
真正容易出问题的,是把 static 当作“线程安全”或“单例保障”来用。它只解决生命周期归属问题,不提供同步、可见性或初始化顺序的自动保证。








