java - 为什么调用静态最终变量时不先执行静态块
问题描述
class Test4 {
public static void main(String as[]) {
System.out.println(Hello.x);
}
}
class Hello {
final static int x=10;
static {
System.out.println("Hello");
}
}
输出:10
Hello
如果我们调用静态变量然后加载第一个类,并且当加载类然后首先它应该执行静态块然后将发送静态变量,为什么它不打印根据我的知识。
解决方案
静态初始化程序块在包含它的类被初始化时执行——这通常是在加载类时。
你会说当你在 class 中访问时,JVM 应该加载和初始化Hello
class 。但是,这里不会发生这种情况,因为这是一种特殊情况。Hello.x
Test4
static final
常量由编译器内联 - 这意味着当编译此代码时,Hello.x
方法main
中的 将在编译时替换为常量的值,即10
. 本质上,您的代码编译为与编译时相同的字节码:
class Test4 {
public static void main(String[] args) {
System.out.println(10); // Inlined constant value here!
}
}
class Hello {
final static int x = 10;
static {
System.out.println("Hello");
}
}
请注意,在这种情况下,类Test4
并没有真正访问类——因此在运行时不会加载类并且不会执行静态初始化程序。Hello
Hello
Test4
推荐阅读
- mysql - 我们可以将 laravel 枚举列设置为唯一吗
- asp.net-core - 如何在 Asp.net core 中关闭 cshtml 中的 html 标签
- r - 如何创建一个新列,其值取决于其他列中的值?
- javascript - 如何使用大量数据(Visjs、cytoscape、sigma 和 vivaGraph)快速绘制社交网络?
- database - 无法使用 xampp 在 localhost/phpymyadmin 上创建数据库
- reactjs - 使用 React 的向导/工作流应用程序
- javascript - 使用 Vue.js 在 WebStorm 中进行调试
- c# - 使用 EPPlus 将背景图像添加到 Excel 不起作用
- python - webscrape 脚本输出数据 3 次。我做错了什么?
- docusignapi - 条件父标签签名选项卡