gpt4 book ai didi

java - Java 字节码中的多个静态 block 发生了什么?

转载 作者:行者123 更新时间:2023-11-30 07:47:33 25 4
gpt4 key购买 nike

这是一个非常基本的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com