最终的静态变量操作,编译还是运行时?

时间:2015-08-23 02:37:07

标签: java

最终的静态变量操作是在运行时还是编译时发生的?例如:

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 ?
}

2 个答案:

答案 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