2011-06-21 466 views
15

假設如下:在Java中,靜態方法中聲明的變量本身是靜態的嗎?

 
private static boolean A() 
{ 
    int parsedUntil = 0; 
    ... 
    ... 
    ... 
} 

是parsedUntil認爲是一個靜態變量?我注意到我不能在這個靜態函數中聲明它是靜態的。

後續問題:我讀了一個靜態變量只會初始化一次。這是否意味着我第一次調用函數A()的值將被設置爲零,但是每隔一次我調用A()時,該行都被省略了?

回答

23

不,它不是一個靜態變量。這是一個局部變量。在方法中聲明的任何變量都是局部變量。如果你想有一個靜態變量,你必須聲明它的方法外:

private static int parsedUntil = 0; 

有沒有宣佈這隻能一個方法中使用靜態變量的方式。

+1

這是關於範圍。無論方法類型如何,作用域都是本地方法。 – Robin

+2

@Robin:不,這是關於一生的。在其他語言中,「靜態局部」可以具有單一方法的作用域,但是有時是有用的靜態生命週期;在這兩種情況下,範圍對於方法來說都是本地的,但是壽命是不同的。 – configurator

6

沒有,A()是一個靜態方法,並parsedUntil裏面A.一個局部變量

修飾符像static不是局部變量有效(僅final被允許AFAIK)

後續問題:我讀過一個 的靜態變量,只會初始化一次 。

真正

是否意味着 我第一次調用函數A()的 值將被設置爲零,但每 其他的時間我稱之爲(),該行是 省略?

因爲parsedUntil不是靜態字段,而是靜態方法中的局部變量,事實並非如此。

+0

但是如果我在函數中聲明它是最終的,它意味着什麼?關於我讀過的類,final關鍵字意味着這樣的類的功能不能被子類重載。 (也許這樣的課程甚至不能延長!?) –

+0

在局部變量中,最後表示該變量不能被重新賦值 –

5

static變量不能在方法內部本地聲明 - 它們只能是類的成員,並且在加載類時會被初始化。

+0

謝謝!當你說他們只能是一個班級的成員時,我記得我已經閱讀過,這很有道理! –

1

Java沒有像C或C++這樣的靜態局部變量,所以你永遠不會有static int parsedUtil = 0;

所以不,parsedUtil沒有任何意義上的「靜態」。每次執行該方法時,其值都被初始化爲0。

+0

局部變量不是用Java初始化的。 – Ian

+0

@Ian - 根據JLS 14.4.2:「*如果一個[局部變量]聲明符有一個初始化符,則初始化符會被賦值並且它的值被賦值給這個變量。*」對於我來說已經足夠接近了) –

+0

公平點。但是,與類或實例作用域的變量不同,Java不會通過** default **進行初始化。這就是我想要說明的一點,雖然重讀你的答案,但我發現它並不適用於這種情況。我的錯。 – Ian

1

不,它不是C.

parsedUntil不是靜態的。這只是一個局部變量。你不能在方法中聲明靜態變量。

關於第二個問題 - 靜態變量可以根據需要分配多次。您不能僅重新分配最終變量。

+0

有關靜態vs最終的很好的解釋,謝謝! –

相關問題