这是一个非常基本的 Java 应用程序,仅包含一个类
。在该类中,有一个 main
方法和两个 static
block 。
class Test {
public static void main(String args[]) {
System.out.println("Main");
}
static {
int a = 10;
}
static {
int a = 20;
}
}
这是编译该应用程序生成的字节码。我不明白静态 block 发生了什么:
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=1, locals=1, args_size=0
0: bipush 10
2: istore_0
3: bipush 20
5: istore_0
6: return
LineNumberTable:
line 34: 0
line 37: 3
line 38: 6
我的问题是:第二个静态 block 在哪里?如果它们合并,那么 JVM 如何区分两个 block 包含的变量,因为两个 block 都具有相同名称和类型的变量?
最佳答案
在这种情况下,您可以看到两个 block 仍然存在。常数10和常数20分别出现在不同的行上。然而,这些 block 是“合并”的,因为它们只是按顺序执行。由于您没有对相关变量执行任何操作,因此两者都只是写入堆栈顶部(我认为这就是 istore_0
所做的),然后被忽略。
Code:
stack=1, locals=1, args_size=0
0: bipush 10
2: istore_0
3: bipush 20
5: istore_0
6: return
编辑:istore_0
将值存储到局部变量。两个 a
是相同的变量。这是因为它们不同时使用,因此编译器只是尝试提高效率并为不同时使用的变量重用堆栈空间。
从概念上讲,两者是不同的变量。如果以后可以使用第一个 a
的值,编译器永远不会这样做。但实际上,它们已被合并以节省空间。这只是一个简单的内存优化。
关于java - Java 字节码中存在多个静态 block 会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49744173/