2013-09-27 28 views
1

我對於我認爲是不一致的背後的推理有些混淆。Java默認值混淆,爲什麼沒有函數作用域變量?

例如

public class Test 
{ 
    static int a; 
    public static void main(String[] args) 
    { 
     System.out.println(a); 
    } 
} 

這樣會打印出0,符合市場預期。但說我們有這個代替,

public class Test 
{ 

    public static void main(String[] args) 
    { 
     int a; 
     System.out.println(a); 
    } 
} 

這不會爲我編譯,抱怨a尚未初始化。我期待它打印出0 ...

這我導致了一些問題:

1)爲什麼不函數範圍的變量有默認值?

2)請問static關鍵字是什麼原因?爲什麼?

+0

在Java中,只有類變量具有默認值。 'Static'與它無關。 –

回答

4

Java語言規範解釋默認Initial values of Variables

每個類變量,實例變量,或陣列組分與創建時的默認值初始化 (§15.9,§15.10):

對於字節類型,默認值爲零,即值爲 (字節)0。

對於short類型,默認值爲0,即 (short)0的值。

對於int類型,默認值是零,即,0

對於類型長,默認值是零,即,0L。

對於浮點類型,默認值爲正零,即0.0f。

對於double類型,默認值爲正零,即0.0d。

對於char類型,默認值爲空字符,即 '\ u0000'。

對於布爾類型,默認值爲false。

對於所有引用類型(§4.3),默認值爲空。

和還指出

局部變量(§14.4,§14.14)必須被明確地給出的值 在使用之前,通過任一初始化(§14.4)或分配 (§15.26 ),可以使用明確的 賦值(§16)的規則進行驗證。

您的問題都可以通過「因爲JLS這麼說」來解答。

一個更完整的答案會是以下幾點:

A類狀態和行爲的描述。一個對象是實際的數據。如果你創建一個對象,它必須有確定的狀態,它不能處於未初始化的狀態。

+0

啊!我已閱讀了第一部分,但我沒有閱讀14.4和相關文檔。 /尷尬。謝謝!! 編輯:是的,我希望有一個更有意義的答案,除了'它說這麼迴應',但我聽說這更多的是在Java的情況下,(Python程序員在這裏)。 –

0

1)爲什麼函數作用域變量沒有默認值?

這是由JLS定義的規則,即方法變量未初始化爲其默認值。你需要使用之前初始化它們

2)請問static關鍵字是原因嗎?爲什麼?

再次形成JLS規則,類實例變量被編譯器初始化爲默認值。你可能會也可能不會初始化它們。作爲鏈接http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

你必須明確地對它們進行初始化提到

0

Java編譯器永遠不會分配默認值局部變量。