簡體   English   中英

靜態初始化器的靜態最終字段初始化

[英]Static final field initialization from static initializer

為什么不能使用聲明類作為限定符(以靜態方式)從相應的靜態初始化程序訪問靜態最終字段?

起初,我認為這是一個Eclipse bug:

Eclipse bug?

我還缺乏一些知識,因為靜態初始化器不是我的日常業務。 但是,看哪,這沒有預期的類限定符:

缺少知識?

為了完成我的測試系列,我在bash中嘗試了一下:

該死的!

導致相同的結果。

這引出了我最后的問題:

從靜態初始化程序塊訪問靜態最終字段時是否有任何理由禁止類限定符? 因為聲明類之前沒有初始化?

實際上,您可以從靜態初始化程序初始化靜態字段。

但我認為(我不確定),你有另一個問題。 這里的問題是你(根據編譯器)嘗試分配最終字段。 但是,你的真實意圖不是分配它......你正在嘗試初始化它 但編譯器沒有得到這個。

當你調用像Test.I這樣的Test.I ,編譯器會認為你正在嘗試修改它之前可能被初始化的靜態變量(即來自靜態初始化器)。 編譯器並不聰明地看到你實際上正在初始化你的變量,它只是解釋你從一個類中分配一個靜態變量,無論是Test還是Foo

但是,如果在沒有類限定符的情況下調用它,編譯器就會知道您正在嘗試修改自己的靜態變量,並且在靜態初始化程序中,因此操作對於最終字段是安全的。

拜托,我希望我足夠清楚,請注意,我不確定這種行為。

為了初始化初始化塊中的最終變量,應該使用變量的簡單名稱。 即變量名單獨,沒有任何限定符。

它在java語言規范中聲明如下

“類似地,每個空白的最終變量必須至多分配一次;當對它進行賦值時,它必須絕對未分配。 當且僅當變量的簡單名稱或其簡單名稱合格時,才會定義此類賦值由此,發生在賦值運算符的左側 .Java編譯器必須執行特定的保守流分析,以確保對於空白最終變量的每個賦值,在賦值之前肯定未賦值變量;否則為必須發生編譯時錯誤。“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM