java - java中的初始化顺序,静态块内的构造函数
问题描述
考虑到标准的 java 初始化顺序规则,我不清楚为什么下面的代码
public class Foo {
static { new Foo(); }
static{ System.out.println("static code"); }
{ System.out.println("non static code"); }
public Foo() { System.out.println("constructor"); }
public static void main(String[] args) {}
}
输出这个:
non static code
constructor
static code
解决方案
JLS 说
初始化类时,静态块和静态变量初始化将按程序源代码顺序执行。
实例初始化时,实例块和实例变量初始化将按程序源代码顺序执行。这发生在超级实例初始化之后和构造函数主体执行之前。
在您的示例中,第一个静态创建了Foo
. 这会导致在Foo
执行第一个静态块时执行实例块。所以,顺序是:
- 类已加载
Foo
触发静态初始化- 执行第一个静态块,它执行
new Foo()
.- 执行实例块 - 打印“非静态代码”
- 构造函数被执行 - 打印“构造函数”
- 第一个静态块完成。
- 第二个静态块被执行——打印“静态代码”。
- 主要方法被调用。
推荐阅读
- python-3.x - opengv 安装不在 pip3 列表中
- excel - 如何删除所有小数点,但在 Microsoft Excel 中保留值?
- variables - 在 Ansible(查找)中的 var 中使用 var - aws_ssm 插件
- android - 旁加载错误 21 签名验证失败
- java - 为什么当最终变量内联初始化值时,该变量与较小的数据类型兼容而无需强制转换?
- google-chrome - 发布将被延迟 广泛的主机权限错误 Chrome 网上应用店
- flutter - Flutter bloc 模式多次重复调用函数
- kubernetes - POD 的 GKE (Google Kubernetes Engine) 网络流量监控,用于详细的基于字节的计费
- regex - 如何替换字符串中的所有内容,但一组子字符串?
- docker - Docker 的 Dotnet 构建崩溃