javac是否预先计算了固定表达式?

Cry*_*tor 0 java javac

是否为此类变量声明提供了优化:

final int secondsInDay = 24 * 60 * 60;
Run Code Online (Sandbox Code Playgroud)

尽管additional_funct根本没有使用,但C++上的这段代码甚至都无法编译:

#include <iostream>

void additional_funct(int num);


void main()
{
    std::cout << "just a text";
}


void additional_funct(int num)
{
    // For both lines will be shown "divide by zero"
    int var = 5 / 0;
    int another_var = num + (2 / 0);
}
Run Code Online (Sandbox Code Playgroud)

这证明了C++编译器在运行之前对数字文字表达式进行了优化,以预先计算它们.虽然相同的Java代码将开始运行:

package experimental_main;

public class Experimental_start {
    public static void main(String[] args) {
        // Will throw ArithmeticException "by zero"
        additionalMethod(2);
        System.out.println("just a text");
    }


    static void additionalMethod(int num) {
        int var = 5 / 0;
        int anotherVar = num + (2 / 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,javac不能用C语言编译代码.但也许它以其他方式提供优化,或者更好地以这种方式声明这样的数字文字:

// 24 * 60 * 60
final int secondsInDay = 86_400;
Run Code Online (Sandbox Code Playgroud)

Sle*_*idi 5

虽然javac没有做任何重大的优化,但这样的表达式可以在javac级别上进行评估,

如果你反编译表达式,int secondsInDay = 24 * 60 * 60;你会得到类似的东西

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
  stack=1, locals=2, args_size=1
     0: ldc           #2                  // int 86400
     2: istore_1
     3: return
  LineNumberTable:
    line 7: 0
    line 9: 3
Run Code Online (Sandbox Code Playgroud)

并且#2 驻留在恒定池中,

Constant pool:
 ...
#2 = Integer            86400
Run Code Online (Sandbox Code Playgroud)

86400正如您所见,表达式被评估为其值.