第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么我們不能通過(guò)未初始化的局部變量訪問(wèn)靜態(tài)內(nèi)容?

為什么我們不能通過(guò)未初始化的局部變量訪問(wèn)靜態(tài)內(nèi)容?

守候你守候我 2023-08-04 14:45:47
看看下面的代碼:class Foo{    public static int x = 1;}class Bar{        public static void main(String[] args) {        Foo foo;        System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized    }}x正如您所看到的,在嘗試通過(guò)未初始化的局部變量Foo foo;代碼訪問(wèn)靜態(tài)字段時(shí)foo.x會(huì)生成編譯錯(cuò)誤:Variable 'foo' might not have been initialized。這個(gè)錯(cuò)誤看起來(lái)似乎是有道理的,但只有當(dāng)我們意識(shí)到要訪問(wèn)成員時(shí),staticJVM 實(shí)際上并不使用變量的值,而只使用其類(lèi)型。例如,我可以foo使用值進(jìn)行初始化null,這將使我們可以x毫無(wú)問(wèn)題地訪問(wèn):Foo foo = null;System.out.println(foo.x); //compiles and at runtime prints 1!!! 這種情況之所以有效,是因?yàn)榫幾g器意識(shí)到它x是靜態(tài)的,并把foo.x它當(dāng)作是這樣寫(xiě)的Foo.x(至少到目前為止我是這么認(rèn)為的)。那么為什么編譯器突然堅(jiān)持使用一個(gè)它根本不會(huì)使用的foo值呢?免責(zé)聲明:這不是在實(shí)際應(yīng)用程序中使用的代碼,而是一個(gè)有趣的現(xiàn)象,我在 Stack Overflow 上找不到答案,所以我決定詢問(wèn)一下。
查看完整描述

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中所示。



查看完整回答
反對(duì) 回復(fù) 2023-08-04
?
米脂

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ò)誤。


查看完整回答
反對(duì) 回復(fù) 2023-08-04
?
慕的地10843

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)。


查看完整回答
反對(duì) 回復(fù) 2023-08-04
?
SMILET

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è)撛趺崔kfoo.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.xx

希望有知情人士能說(shuō)出真正的原因。:-)


查看完整回答
反對(duì) 回復(fù) 2023-08-04
  • 4 回答
  • 0 關(guān)注
  • 175 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)