gpt4 book ai didi

java - 编译时间常数

转载 作者:行者123 更新时间:2023-11-30 01:57:29 25 4
gpt4 key购买 nike

我从 Compile-time constants and variables 了解到编译时间常数规则是什么。 .

  1. 宣布为最终版本
  2. 具有原始类型或字符串类型
  3. 与声明同时初始化
  4. 用常量表达式初始化
<小时/>
final int x = 5;

但我不明白为什么下面的代码不这样做:

final int x;
x = 5;

唯一的区别是上面的第三点。在不同行而不是同一行上进行初始化有何不同。

最佳答案

情况 1 final int x = 5;

public static void main(String[] args) {
final int x = 5;
}

生成的字节码是:

  public static main([Ljava/lang/String;)V
L0
LINENUMBER 3 L0
ICONST_5
ISTORE 1
L1
LINENUMBER 4 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE x I L1 L2 1
MAXSTACK = 1
MAXLOCALS = 2

情况 2 final int x; x = 5;

public static void main(String[] args) {
final int x;
x = 5;
}

生成的字节码是:

  public static main([Ljava/lang/String;)V
L0
LINENUMBER 4 L0
ICONST_5
ISTORE 1
L1
LINENUMBER 5 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE x I L1 L2 1
MAXSTACK = 1
MAXLOCALS = 2

正如您所看到的,除了行号之外,这两种情况没有任何区别。

事实上,在像 InteliJ 这样的 IDE 中,您会看到提示(作为灯泡)将案例 2 的 2 行连接到案例 1 中的 1 行。

如果您阅读了您提供的链接中的所有答案和评论,
对此你会更加困惑而不是明智。
一切都与术语有关,在本例中是未记录术语。

这是该链接中答案之一的摘录:

The JLS does not contain the phrase compile-time constant.
However, programmers often use the terms compile-time constant and constant interchangeably.

现在介绍编译器如何使用这两种情况。
如果您在两个方法的末尾添加这一行:

System.out.println(x);


生成的字节码是:
对于情况1

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ICONST_5
INVOKEVIRTUAL java/io/PrintStream.println (I)V

对于情况 2

GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ILOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (I)V

第二种情况有所不同:ILOAD 1 而不是 ICONST_5
意思是在第一种情况下 x 被 5 替换,而在第二种情况下则没有,并且 x 的值被调用(加载)以执行该语句。

关于java - 编译时间常数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53897620/

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