2013-04-12 70 views
2

我對Java中的局部變量和成員變量有疑問。情況是:有時如果我定義一個局部變量,那麼該變量必須被傳遞到幾個方法調用級別。我經常想,爲什麼要爲類定義一個成員變量,以便該類中的變量可用。類的成員變量就像一個全局變量,可以在類中隨處訪問。Java中的局部變量或成員變量

  1. 這種情況下的最佳做法是什麼?或者什麼是正確的做法?

  2. 如果我將它定義爲一個成員變量,它應該是一個靜態或非靜態變量?

回答

0
  1. 如果你決定宣佈一個成員變量,那麼你應該考慮的變量的作用域。如果您只是減少內部方法調用的參數數目,我會考慮將變量聲明爲private

  2. 你應該小心使用Static的,因爲類的每個實例都將使用該變量的同一副本。

0

它是行爲型的。如果變量是類屬性的一部分,即表徵類行爲的特徵,則將其定義爲類成員變量,否則在方法內部定義局部變量。

在我看來,傳遞參數不會影響屬性類型定義。

5

成員變量保持特性 - 屬性是另一個詞 - 在由類來表示你的程序的「東西」。如果你的變量持有這樣的東西,使它成爲一個成員變量;如果沒有,不要。

靜態變量保持類本身的特性,而不是該類的對象的特性。

不要做出決定根據是否「通...到方法調用的幾個層次。

+0

要添加到此...請記住,您可以將參數從一個方法傳遞到同一個類中的另一個方法。另一方面,如果很多方法需要訪問同一個變量,那麼它很可能是一個成員變量。 –

+1

我同意它應該是,但我認爲這是從錯誤的方向看它。如果你通過他們的方法如何設計你的類,你可以自下而上,並且*試着*通過檢查單個樹來查看森林。在你寫*任何方法之前,應該決定什麼成員變量;如果你有什麼東西被「很多」傳遞,那麼看看整個設計;也許還有別的東西應該是一個階級,而不是。請記住,本身並沒有錯,通過很多方法傳遞變量。 – arcy

+0

我同意你的意見;我應該說,「你應該重新評估你的設計,看它是否應該是一個成員變量」,而不是「它應該是一個成員變量」。 –

0

這要看情況。

如果你希望所有(或幾個),你的方法訪問相同的成員變量,然後在類聲明它。

靜態或不依賴於閹該信息屬於類(靜態),或者對類(非靜態)的一個實例。

0

1.)如果你打算用多種方法來使用它,並且需要t將它傳遞給其成員變量。如果只是爲了這個方法而使它變成本地的。

2.)static意味着它們的只有一個被一切之間共享變量的實例。因此,例如,我有一個totalGameScore變量,無論發生什麼,它都會保持我整個遊戲的得分。你會想讓這個變量static。除此之外,可以說我有一個health變量爲我的敵人。每個敵人將擁有自己的health,所以我不會讓這個變量static

您還可以聲明成員變量private,以便其他類無法訪問它們。 Constants通常應該始終是成員變量。

2

你的一般問題的思考,我想出了從我的經驗,這些準則:

  • 使用最小poosible範圍。如果一個局部變量很好,那麼爲什麼使用一個成員變量?
  • 根據域對類進行建模。如果你有價值並且是類責任的一部分,那麼將它建模爲類成員似乎是合適的。

第二個問題:我通常將靜態變量定義爲最終的常量。多線程環境中的非最終靜態成員可能很容易引入競爭條件。如果需要,更容易訪問非靜態成員線程安全的。

+0

將靜態變量視爲「最終」,但通常該變量必須更改。例如,你有一個ArrayList,其大小在調用某些方法時保持不斷變化。所以,最終應該用在極限上。例如,你有一個該變量的靜態初始化,那麼你知道它在程序運行期間不會改變。對? – user697911

+0

聲明一個ArrayList作爲最終的靜態成員,並且仍然可以從ArrayList添加或刪除對象。最終的靜態成員不能被重新分配=>對ArrayList的引用不能被修改。可以理解的? – remipod

+0

下面是一個很好的解釋:http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html如果你想讓靜態最終的ArrayList不可修改,請檢查這個方法http://docs.oracle。 COM/JavaSE的/ 6 /文檔/ API/JAVA/util的/ Collections.html#unmodifiableList(java.util.List中) – remipod