4 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
§15.11。字段訪問(wèn)表達(dá)式:
如果該字段是靜態(tài)的:
對(duì) Primary 表達(dá)式進(jìn)行求值,并丟棄結(jié)果。如果主表達(dá)式的求值突然完成,則字段訪問(wèn)表達(dá)式也會(huì)出于同樣的原因突然完成。
之前它指出字段訪問(wèn)由 標(biāo)識(shí)?Primary.Identifier
。
這表明,即使它似乎沒(méi)有使用Primary
,它仍然會(huì)被評(píng)估,然后結(jié)果會(huì)被丟棄,這就是為什么它需要初始化。當(dāng)評(píng)估如引用中所述停止訪問(wèn)時(shí),這可能會(huì)產(chǎn)生影響。
編輯:
這是一個(gè)簡(jiǎn)短的示例,只是為了直觀地演示Primary
即使結(jié)果被丟棄,也會(huì)對(duì) 進(jìn)行評(píng)估:
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()仍然被評(píng)估,因?yàn)樗黳rint被延遲了 5 秒,Thread.sleep()即使它總是返回一個(gè)null被丟棄的值。
如果未計(jì)算表達(dá)式,則會(huì)立即出現(xiàn),這可以在直接使用print類(lèi)訪問(wèn)時(shí)看到 。FooxFoo.x
注意:?方法調(diào)用也被視為§15.8 主表達(dá)式Primary
中所示。

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

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

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
其他答案完美地解釋了正在發(fā)生的事情背后的機(jī)制。也許您還想了解 Java 規(guī)范背后的基本原理。作為一個(gè) Java 專(zhuān)家,我無(wú)法告訴你最初的原因,但讓我指出這一點(diǎn):
每一段代碼要么有意義,要么觸發(fā)編譯錯(cuò)誤。
(對(duì)于靜態(tài),因?yàn)閷?shí)例是不必要的,
Foo.x
所以很自然。)現(xiàn)在,我們?cè)撛趺崔k
foo.x
(通過(guò)實(shí)例變量訪問(wèn))?這可能是一個(gè)編譯錯(cuò)誤,如 C# 中的錯(cuò)誤,或者
它有一個(gè)意義。因?yàn)?code>Foo.x已經(jīng)意味著“簡(jiǎn)單地訪問(wèn)”,所以該表達(dá)具有不同的含義
x
是合理的;也就是說(shuō),表達(dá)式的每個(gè)部分都是有效且可訪問(wèn)的。foo.x
x
希望有知情人士能說(shuō)出真正的原因。:-)
添加回答
舉報(bào)