static是归属修饰符,非访问控制符,它使成员属于类而非对象,实现共享与类加载即存在;访问权限仍由public、protected、default、private决定。

static 本身不直接限制访问范围,它改变的是成员的归属关系——从“属于对象”变成“属于类”。真正控制能否访问的,是 public、protected、default、private 这些访问修饰符。static 和它们组合使用时,影响的是“谁能在什么前提下访问这个类级别的成员”。
static 不是访问控制符,而是“归属修饰符”
Java 中限制访问范围的只有四个访问修饰符。static 的作用是让变量或方法脱离实例,成为类本身的成员。这意味着:
- 静态成员随类加载而存在,无需创建对象就能访问(前提是访问权限允许)
- 静态成员被所有实例共享,内存中只有一份
- 但它能不能被访问,仍取决于你加的是 public、protected、default 还是 private
static + 不同访问修饰符的实际效果
关键看组合后“谁可以调用”,而不是 static 单独起作用:
-
public static:任何类都能通过
类名.成员访问(如Math.PI、System.out) - protected static:同一包内任意类可访问;不同包中,仅限继承该类的子类能访问(注意:必须有继承关系,不是所有子类自动可见)
- default static(不写修饰符):仅限同一包内的类通过类名访问,跨包即不可见
-
private static:只能在声明它的类内部访问,常用于工具方法或内部缓存(如
Collections.EMPTY_LIST的初始化逻辑)
static 对访问方式的隐性约束
即使访问权限允许,static 还带来两条硬性规则:
- 静态方法里不能直接使用
this或super—— 因为它不属于任何实例 - 静态方法中不能直接调用非静态成员(变量或方法),否则编译报错;反过来,非静态方法可以自由访问静态成员
常见误用与实际建议
开发者容易混淆“能访问”和“该不该访问”:
- 不要因为某个字段被
static修饰,就把它设为public—— 共享状态更需封装,优先考虑private static+ 提供public static访问器 -
main方法必须是public static,是因为 JVM 需要不依赖实例直接启动它 - 工具类(如
StringUtils)中的方法通常声明为public static,方便全局调用;而内部缓存或配置常设为private static final
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











