Java 中静态代码块中如何调用静态方法
静态代码块中可直接调用静态方法,但被调方法不能依赖未初始化的静态变量。执行顺序按源码顺序,方法需先定义或可见。跨类调用需权限足够且类已加载。需注意静态变量可能为默认值。
一句话总结:静态代码块里直接调用静态方法,Ja va 是允许的,但得留个心眼——调用的方法不能依赖还没初始化好的静态变量。而且执行顺序是按源码顺序来的,方法得先定义,或者至少对静态块来说可见。跨类调用的话,权限要够、类要已经加载。
很多初学者会纠结:静态代码块和静态方法到底谁先谁后?其实很简单。
类加载时,静态代码块和静态变量按照它们在源码中间出现的顺序依次执行。静态方法本身不会自动跑,但你可以在静态块里显式调用它——前提是这个方法不去碰那些还没初始化的静态字段。
- 被调用的静态方法必须是
public、protected或包内可见,并且由static修饰。 - 同类内调用不需要类名前缀;跨类调用要加上类名,比如
Utils.init()。 - 如果方法内部读了在后面才赋值的静态变量,那拿到的就是默认值(0、null、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 上。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













