静态代码块可调用已定义的静态方法,需确保方法不依赖未初始化的静态变量;二者按源码顺序执行,静态方法须在块前声明或可见,跨类调用需权限允许且类已加载。

静态代码块中可以直接调用静态方法,前提是该静态方法已定义(或在类中已声明),且调用时方法本身不依赖尚未初始化的静态变量。
静态代码块与静态方法的执行顺序
Java 类加载时,静态代码块和静态变量按在源码中出现的顺序依次执行。静态方法本身不会自动执行,但可在静态代码块中显式调用——只要该方法不访问尚未初始化的静态字段。
- 静态方法必须是 public、protected 或包内可见(默认),且为 static 修饰
- 调用时无需类名前缀(同类内);跨类需加类名,如 Utils.init()
- 若静态方法内部访问了在它之后才初始化的静态变量,会得到默认值(如 null、0、false)
正确调用示例
以下写法合法且常见:
public class Example {
static int count = 10;
static {
System.out.println("进入静态块");
init(); // 直接调用本类静态方法
System.out.println("count = " + count); // 输出 10
}
static void init() {
count *= 2; // 修改静态变量
System.out.println("init 执行完毕");
}
}
运行时输出顺序为:
进入静态块
init 执行完毕
count = 20
需要注意的限制
不能在静态代码块中调用尚未声明的静态方法(编译报错),也不能安全依赖其返回值去初始化早于它的静态字段。
- 方法定义必须出现在静态代码块之前,或至少在同一编译单元中可见(编译器允许后置定义,但不推荐)
- 避免在静态方法中读取当前还未执行到的静态变量赋值语句——逻辑易出错
- 构造器、实例方法、this、非静态字段均不可在静态上下文中使用
跨类调用静态方法
只要权限允许,静态代码块可调用其他类的静态方法:
static {
String s = StringUtils.defaultString(null); // 调用 Apache Commons 的静态方法
Config.load(); // 调用自定义工具类的静态初始化方法
}
注意确保目标类已被 JVM 加载(通常无问题),且依赖库已引入classpath。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











