2013-09-30 178 views
2

只是爲了闡明我在思考這個問題,在java中,靜態字段是一個變量/字段,它被整個類使用,或者可以被所有引用該類的對象使用?非靜態字段是由對象定義的變量嗎?而引用與對象1相同的類的第二個對象可以具有與對象1的靜態字段不同的值?靜態和非靜態字段

回答

2

在創建該類的實例之前,可以訪問類中的靜態字段或靜態類變量,而不像實例變量。當在運行時創建該類的實例時,會創建類中的實例變量(非靜態變量)。因此,只有在創建該類的實例時才能訪問非靜態變量。而靜態類成員可以在之前被訪問該類被創建或實例化。

該類的所有實例都可以訪問相同的靜態變量。另一方面,實例變量是單獨/封裝到類的每個實例的。

+0

困擾,有道理。換句話說,如果我聲明一個靜態字段,它可以被該類的所有實例使用? –

+0

是的,該類的所有實例都共享該靜態變量的值。 – blackpanther

+0

@ChrisLondon,可以在類的所有實例中使用靜態字段 –

1
  • 靜態場共享和所有對象使用,類加載時加載
  • 非靜態字段是爲每個對象單獨的副本,並且當創建

而一個一個對象加載非靜態字段是由對象定義的變量嗎?

當你創建一個新的對象,每個對象都將有自己的實例副本即非靜態字段

和第二對象指的同一類對象1可以有不同的價值對象1的靜態字段?

並沒有真正得到你的問題,但

  • 如果object1和對象2是一類instnaces,那麼如果object1修改類的靜態字段,然後將Object2的獲取更新的價值
0

類型...靜態對象在類的實例之間共享,而非靜態對象是特定於實例的類。方法也一樣。

+0

一個靜態變量或字段。並非所有字段都是對象 – Cruncher

1

實例屬性是特定於實例的屬性,其值不會在同一類的其他實例中共享。

在另一方面,一類(或靜態)屬性是一個通用於所有類的實例,因爲它屬於類,而不是特別的實例。

所以你必須小心使用靜態屬性,因爲一個變化會反映在所有使用它的代碼上,有時會導致意外的結果。在實踐中,我傾向於避免靜態屬性,除了它們具有不變的,不可變的值的情況。

類似的考慮適用於實例方法和靜態方法:實例方法可以「查看」實例和靜態方法和屬性,而靜態方法只能引用類的靜態方法和屬性,並且不能「請參閱「實例方法和屬性(即除非它實例化對象並使用它來訪問其實例成員)。

0

As said in the reference :

如果字段聲明爲靜態,存在的 只有一個化身領域,不管有多少類 的情況下(可能是零)最終可能會被創建。一個靜態字段,有時稱爲類 變量,在類被初始化(§12.4)時體現出來。

0

參考JLS §8.3.1.1

如果某個字段聲明static,存在的領域,只有一個化身,不管有多少實例(可能是零)之類的可能最終被創建。一個靜態字段,有時稱爲類變量,在類初始化時體現出來(§12.4)。

與此相反,一個類的每個實例包含非靜態字段自己的獨特值。

未聲明static甲場(有時稱爲非static場)稱爲實例變量:當類是實例非靜態字段體現。無論何時創建類的新實例(§12.5),都會爲該類或其任何超類中聲明的每個實例變量創建與該實例關聯的新變量。