众所周知,javac在编译时会内联常量,这可能会导致有趣的问题,特别是当只重新编译应用程序的某些部分时。大家都知道解决方法(让javac不理解它实际上是一个编译时常量)。
但如果我们查看oracle JDK中System.class的代码,我们会看到以下内容:
因此,可以推断出
javac是否特殊处理了这种情况,还是语言规范实际上已经明智地处理了这种情况?
但如果我们查看oracle JDK中System.class的代码,我们会看到以下内容:
public final static PrintStream out = null;
因此,可以推断出
out
是通过反射或JVM初始化中的其他机制设置的。但是这引出了一个问题:为什么这里没有内联out
?(至少我使用System.out.println()
时从未收到过空指针异常)。javac是否特殊处理了这种情况,还是语言规范实际上已经明智地处理了这种情况?