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
添加回答
舉報