1 回答

TA贡献1865条经验 获得超7个赞
在Java中,类的静态变量是在运行时还是在编译时创建的?
Java 在编译时没有“创建”变量,如果创建意味着分配和初始化。它们都是在运行时创建的。它们是否static
与何时分配static final
无关。
但我有点期望最终的静态变量 PI 将在编译时创建(因此它将被“嵌入”在 .class 文件中),因为我认为这会有更好的性能......
这不是它在 Java 中的工作方式。当类文件被“编译”时,它们实际上主要是被编码的。肯定有一些工作已经完成,但我们认为编译的超大比例(就 C 等语言而言)是在运行时发生的。当我们查看优化和内联时尤其如此。
如果可能的话,编译器会做一些前期工作,例如能够提前预先计算字段(静态或实例)的值。例如,如果你像下面这样定义你的字段,那么乘法将在编译时完成:
private long timeoutMillis = 10 * 24 * 3600 * 1000;
对于 s 也是如此,String
如果可能,编译器会将常量字符串附加在一起。以下内容在运行时不使用 a StringBuilder
,而是String
在编译时创建一个:
private static final String DEFAULT_HEADER = "A long headers that is " + "broker into two lines\n";
但是,在这两种情况下,字段( thelong timeoutMillis
和 the String DEFAULT_HEADER
)的分配和初始化都是在运行时完成的。
如果静态变量和最终静态变量都在运行时创建,那么在 Main 的第一个版本中,MyClass 类的两个静态变量(实例和 PI)都不会创建。
在您的示例中,第一次加载static
类时分配和初始化字段(final
或不) 。因此,在您的第一个or字段中,永远不会像您提到的那样创建。在你的第二个例子中。一旦被引用,类文件将被加载并创建字段。Main
instances
PI
static
MyClass
static
添加回答
举报