发布于2026-07-05 阅读(0)
扫一扫,手机访问
一句话总结:静态代码块里直接调用静态方法,Ja va 是允许的,但得留个心眼——调用的方法不能依赖还没初始化好的静态变量。而且执行顺序是按源码顺序来的,方法得先定义,或者至少对静态块来说可见。跨类调用的话,权限要够、类要已经加载。
很多初学者会纠结:静态代码块和静态方法到底谁先谁后?其实很简单。
类加载时,静态代码块和静态变量按照它们在源码中间出现的顺序依次执行。静态方法本身不会自动跑,但你可以在静态块里显式调用它——前提是这个方法不去碰那些还没初始化的静态字段。
public、protected 或包内可见,并且由 static 修饰。Utils.init()。下面这种写法很常见,也完全合法:
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 上。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8