4 回答

TA貢獻1883條經驗 獲得超3個贊
§15.11。字段訪問表達式:
如果該字段是靜態的:
對 Primary 表達式進行求值,并丟棄結果。如果主表達式的求值突然完成,則字段訪問表達式也會出于同樣的原因突然完成。
之前它指出字段訪問由 標識?Primary.Identifier
。
這表明,即使它似乎沒有使用Primary
,它仍然會被評估,然后結果會被丟棄,這就是為什么它需要初始化。當評估如引用中所述停止訪問時,這可能會產生影響。
編輯:
這是一個簡短的示例,只是為了直觀地演示Primary
即使結果被丟棄,也會對 進行評估:
class Foo {
? ? public static int x = 1;
? ??
? ? public static Foo dummyFoo() throws InterruptedException {
? ? ? ? Thread.sleep(5000);
? ? ? ? return null;
? ? }
? ??
? ? public static void main(String[] args) throws InterruptedException {
? ? ? ? System.out.println(dummyFoo().x);
? ? ? ? System.out.println(Foo.x);
? ? }
}
在這里您可以看到它dummyFoo()仍然被評估,因為它print被延遲了 5 秒,Thread.sleep()即使它總是返回一個null被丟棄的值。
如果未計算表達式,則會立即出現,這可以在直接使用print類訪問時看到 。FooxFoo.x
注意:?方法調用也被視為§15.8 主表達式Primary
中所示。

TA貢獻1836條經驗 獲得超3個贊
第 16 章 明確分配
當發生對其值的任何訪問時,每個局部變量(第 14.4 節)和每個空白最終字段(第 4.12.4 節、第 8.3.1.2 節)必須具有明確指定的值。
您嘗試通過局部變量訪問什么并不重要。規則是必須在此之前明確賦值。
要計算字段訪問表達式?foo.x
,必須首先計算primary
它的部分 ( )。foo
這意味著將發生訪問foo
,這將導致編譯時錯誤。
對于局部變量或空白最終字段 x 的每次訪問,必須在訪問之前明確分配 x,否則會發生編譯時錯誤。

TA貢獻1785條經驗 獲得超8個贊
保持規則盡可能簡單是有價值的,“不要使用可能尚未初始化的變量”就這么簡單。
更重要的是,有一種調用靜態方法的既定方法 - 始終使用類名,而不是變量。
System.out.println(Foo.x);
變量“foo”是不需要的開銷,應該被刪除,編譯器錯誤和警告可以被視為有助于實現這一點。

TA貢獻1796條經驗 獲得超4個贊
其他答案完美地解釋了正在發生的事情背后的機制。也許您還想了解 Java 規范背后的基本原理。作為一個 Java 專家,我無法告訴你最初的原因,但讓我指出這一點:
每一段代碼要么有意義,要么觸發編譯錯誤。
(對于靜態,因為實例是不必要的,
Foo.x
所以很自然。)現在,我們該怎么辦
foo.x
(通過實例變量訪問)?這可能是一個編譯錯誤,如 C# 中的錯誤,或者
它有一個意義。因為
Foo.x
已經意味著“簡單地訪問”,所以該表達具有不同的含義x
是合理的;也就是說,表達式的每個部分都是有效且可訪問的。foo.x
x
希望有知情人士能說出真正的原因。:-)
添加回答
舉報