2012-02-29 54 views

回答

4

如果它是一個字段(靜態或實例變量),那麼兩者大致相同,因爲null是默認值。 (如果一個超級構造函數調用覆蓋方法來設置值,這是一個細微的差別,但這是一個極端情況。)

如果它是一個局部變量,它們非常不同 - 在第一種形式中,局部變量是明確指定,並且該值可以在下一個語句中讀取。在第二種形式,變量明確分配,你將無法從代碼讀取它,直到這種地步編譯器可以證明一個值將被寫入:

void foo() { 
    String x = null; 
    String y; 

    System.out.println(x) // Fine, prints null 
    System.out.println(y); // Compile-time error 
} 
+0

所以在局部變量可以使用之前,它必須被聲明和賦值。我想知道爲什麼不能給本地變量一個默認值? – Ivan 2012-02-29 07:42:05

+0

@Ivan:因爲它有助於防止出現錯誤,那裏有一個你沒有想到的代碼路徑 - 例如你*認爲你總是會進入一個循環,因爲你沒有考慮到特定的場景。 – 2012-02-29 07:45:15

0

第一個聲明給出connection a 的值爲空。這是完全有效的代碼,並且可以很好地編譯,但是如果你試圖調用一個方法,你會得到一個NullPointerException異常。

第二次申報離開connection未初始化。您可以稍後通過爲其分配一個值來初始化它,但如果在初始化之前嘗試訪問它,則代碼將不會編譯。 Java(明智地)在編譯器/ JIT中具有保護功能,以防止您訪問未初始化的值。

第二個版本是在一對夫婦的情況下非常有用:

  • 當你想在將在以後的構造被初始化類聲明的字段。
  • 當要聲明變量具有較大範圍(在方法中的頂層範圍例如,使得該方法中的多個代碼塊可以訪問相同的值)
1

這些答案中給出任何有關Java基礎知識的書籍。當變量用作類字段時,將自動分配空值。如果變量是在一個方法中創建的,那麼直到null或某個值被分配給它才能被使用。

-1

這裏我們有2個案例。

  1. 原語: 在這種情況下,如果我們的值賦給一個原始的,這將是它的價值。如果我們沒有賦值,數值類型的默認值將爲0,因爲布爾值將爲假...

  2. 對象,非基元: 在這種情況下,如果我們分配一個值..比方說,使用新的,我們將有一個新的對象具有新的價值。 如果我們不進行初始化,任何對象(Object類的子類)的默認值,將爲空

音符。這是對發生的事情的一個非常簡短的描述......需要對這個主題進行研究,以便對此有一個清晰和正確的想法。

+0

只有當變量是類或實例成員時纔是如此。 – EJP 2012-02-29 09:24:38

+0

沒錯。如果你沒有在方法內賦值(null),代碼將不能編譯 – tartak 2012-02-29 09:26:37

+0

而且* *只有在變量在被設置之前被使用纔是真的。你的答案根本上是有缺陷的。這裏有兩種以上的情況。 – EJP 2012-02-29 10:08:44

3

這取決於上下文。

如果connection是一個字段,則沒有區別。字段默認初始化,並且具有引用類型的字段默認初始化爲null

如果connection是局部變量,則第二種形式表示connection變量未初始化。沒關係,但編譯器會堅持在你嘗試使用它的值之前,變量肯定是初始化的(以後)。

相關問題