最终的静态变量操作是在运行时还是编译时发生的?例如:
public static final int ID_1 = 1;
public static final int ID_2 = 2;
public static int test(){
return ID_1 + ID_2; // Does this addition execute in compile or runtime ?
}
答案 0 :(得分:6)
这里有一个提示:https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
它说:
如果将基本类型或字符串定义为常量并且该值在编译时已知,则编译器会将代码中的常量名称替换为其值。
因此,一旦完成并且您最终在方法中使用1 + 2
,那么优化它也是合乎逻辑的,并且只需在编译时使用3
。
为了在实践中证明这一点,你可以编译你的代码然后反编译它以查看发生了什么。
我尝试使用JD-GUI,这是我在反编译代码时得到的结果:
public class TestCompileOrRuntime
{
public static final int ID_1 = 1;
public static final int ID_2 = 2;
public static int test()
{
return 3;
}
}
因此,在这种情况下,编译器会在编译时解决操作。
答案 1 :(得分:2)
这是编译时操作(我在下面获得了一个本地GHCi> :set -XOverloadedStrings
GHCi> test "___\t___\t\t___\t\t\t___\n"
___ ___ ___ ___
方法)。我们可以使用iconst_3
直接检查生成的字节码。我创建了一个类javap -v
,如
Main
然后运行package com.stackoverflow;
public class Main {
public static final int ID_1 = 1;
public static final int ID_2 = 2;
public static int test() {
return ID_1 + ID_2; // <-- Compile time.
}
}
以获取
javap -v