2010-01-18 50 views
9

除了範圍和存儲區別之外,java中的實例變量和局部變量之間是否還有其他主要區別?Java中的本地變量和實例變量有什麼區別

+0

複製? http://stackoverflow.com/questions/1794141/java-instance-variables-vs-local-variables – 2010-01-18 18:35:52

+3

「除了差異,有什麼區別?」 :-)你在尋找什麼樣的差異?優化和壽命還是別的? – Fredrik 2010-01-18 18:36:45

回答

23

一個額外的東西我能想到的:

實例變量給出的默認值,即空,如果它是一個對象引用,0,如果它是一個int。

局部變量不會得到默認值,因此需要顯式初始化(​​如果不這樣做,編譯器通常會抱怨)。

7

不,你幾乎覆蓋了它。一個實例變量屬於一個類的一個實例,一個局部變量屬於一個棧幀。

實例變量被初始化爲默認值,但通常情況下最好使用顯式初始化。

33

,我看到的主要區別是在他們:

範圍:局部變量只在它們被聲明,而實例變量可以在類的所有方法被看作該方法或塊是可見的。

聲明的地方:局部變量是在方法或塊內聲明的,而類中的實例變量卻在方法外。

生存時間:當一個方法調用中創建和當方法退出,而實例變量時,有他們沒有參考使用新的和由垃圾收集銷燬創建摧毀局部變量。

訪問:您不能訪問局部變量,而實例變量如果聲明爲公共,則可以訪問它們。

聲明的位置:局部變量在調用之前在方法或塊中聲明,而實例變量可以在類級別的任何地方聲明(即使在它們使用後)。

編輯:

我忘了提,實例變量總是具有價值,即使它不是由代碼分配(那麼他們將有例如NULL,0,0.0,假的)。對於局部變量,代碼中必須有一個賦值,否則編譯器會產生一個錯誤。

+0

你打算成爲「範圍」和「存在時間」和「他們被宣佈的地方」之間的區別是什麼?另外,我不明白你的「訪問」部分的重要性 - 這意味着什麼「訪問」本地? – danben 2010-01-18 18:46:56

+0

@danben:訪問對本地變量沒有意義。這就是爲什麼它與實例變量有所不同。我同意這是一個微不足道的差異,但仍... ...! 「宣稱的地方」也是如此。至於範圍和存在時間(或壽命),它們是完全不同的術語。而且我也忘了再添加一個,我現在要編輯和添加。 – Alex 2010-01-18 18:53:41

0

主要區別是實例變量獲取像int值這樣的默認值get零char獲取null而不是局部變量。 您可以保留未初始化的實例變量,但是必須初始化本地變量,否則會出現編譯器錯誤。

7

另一個區別是,您不必擔心併發訪問局部變量;而您在多線程環境中使用實例變量。

1

除了這裏已經提到的所有內容之外,我想指出的是本地變量對於訪問JVM有點快。與本地變量相比,JVM有更多的工作要做,以讀取或寫入實例變量。對於當前的Hotspot服務器JVM來說,這仍然是正確的,因爲它不是虛擬機優化問題,而是由於實例變量在方法外可見並且可以在執行該方法時從其他線程訪問的事實引起的。

+0

你能提供證明這是真實的參考嗎?我懷疑讀取最終局部變量的速度比最終實例字段快。 – user2418306 2016-05-02 07:24:59

0

方法,構造函數或塊內定義的變量稱爲局部變量。該變量將在方法中聲明和初始化,並且在方法完成時它將被銷燬。

實例變量是類中的變量,但不包含任何方法。這些變量在加載類時被實例化。

+0

實例變量在構造類的實例時實例化。 – EJP 2016-08-07 23:41:01

2

局部變量:

  • 被聲明的方法/構造內或塊(在大括號)
  • 必須在使用前進行初始化內,否則將不能編譯。

實例變量:

  • 是一個類中聲明。
  • 初始化不是強制性的:如果忽略,它包含默認值(0,0.0,falsenull等)
1
從上面提到的所有差異

之外,我想指出一個更差實例變量可以具有訪問修飾符(如私有,公共,受保護等),但局部變量將不具有任何訪問修飾符。

0

局部變量在方法中聲明。

實例變量在類中聲明,但不在方法中聲明。

局部變量沒有得到默認值。如果在變量初始化之前嘗試使用局部變量,編譯器會發出抱怨。

但是,實例變量總是會得到一個默認值。如果您沒有明確地爲實例變量賦值,那麼實例變量仍然有一個值。

整數0

浮點0

布爾值false

引用空

相關問題