2016-08-22 25 views
0

我想確定什麼是Java中已聲明但未初始化的變量/對象的狀態。在Java中聲明的未初始化變量會怎樣?它有價值嗎?

我不能實際測試它,因爲我不斷得到「未初始化」警告,我似乎無法抑制它,並且無法進行測試,如果我初始化變量。

雖然例如,我猜如果變量是integer它可能等於。

但是,如果變量是一個字符串,將等於nullisEmpty()將返回true

所有非初始化變量的值是否相同?或者每個聲明(含義,int,string,double等)在未初始化時都有不同的值?


**** ****更新

因此,正如我現在看到的,它使一個很大的區別,如果變量聲明爲locallyClass,但我似乎無法理解爲什麼當在類中聲明爲靜態時它不會給出任何錯誤,但是當在main中聲明時它會生成"Not Initialized" error

+1

它取決於一個類變量還是一個局部變量?一個類變量要麼是'null',要麼是它的代表默認值,局部變量不能被單元化。 – SomeJavaGuy

+0

那麼有沒有辦法不初始化一個局部變量?嗯,讓我們說它的一個類變量,在任何情況下,它會是空的?我會得到整數,但對於字符串等仍然是空? – hedgehog

+1

如果聲明一個對象,比如'String myString;'但是別的什麼都不做,那麼在運行時使用'myString.isEmpty()'會產生一個'nullPointerException'。 基本上默認爲'0','0.0'等.... – jr593

回答

2

JVM的確切程度如何完全取決於JVM,對於程序員來說應該不重要,因爲編譯器確保您不讀取未初始化的本地變量。

字段然而是不同的。它們在讀取之前不需要分配(除非它們是final)並且未分配的字段值爲參考類型的null或適當基元類型的0值(如果該字段具有基元類型)。

s.isEmpty()用於字段String s;尚未分配結果NullPointerException


因此,正如我現在看到的,它使得如果變量聲明爲locallyClass,但我似乎無法理解爲什麼在類聲明時,它提供沒有錯誤有很大的區別,但是在主體中聲明時會產生"Not Initialized"錯誤。

一般來說,使用沒有值的值是不可取的。爲此,語言設計者有兩種選擇:

a)爲尚未初始化的變量定義默認值
b)防止程序員在寫入變量前訪問變量。 b)很難實現領域,因此選擇a)選擇領域。 (根據調用的順序,可能有多種讀取/寫入方法可能是有效的或無效的,這些只能在運​​行時確定)。

對於局部變量選項b)是可行的,因爲可以爲賦值語句檢查所有可能的方法執行路徑。這個選項是在局部變量的語言設計中選擇的,因爲它可以幫助發現許多簡單的錯誤。

+0

我明白現在,你是否也可以看到更新並告訴我這個呢? – hedgehog

+1

@hedgehog相同的答案,將其聲明爲類級別的靜態變量,並將其用靜態方法在本地進行延遲 – SomeJavaGuy