2012-09-15 26 views
1

當我們有一個類的最終實例變量時,它是爲每個由該類創建的對象實例化還是隻創建一次並被引用?
如果最終變量是一個本地類變量,情況如何?是每次實例化的最終變量

+0

它們被稱爲「字段」,而不是「變量」 – Bohemian

+0

您可以通過在對象的構造函數中放置print語句來測試它。 –

+0

@波希米亞 - 它們也被稱爲實例變量。甲骨文稱他們爲好,所以我們也可以這樣做;例如http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html –

回答

2

最終變量爲類的每個實例實例化。曾經分配給它們的值可能不會改變。這些變量可以通過初始化程序或賦值語句初始化一次。

你所指的是靜態變量。這些變量不是附加到一個特定的對象上,而是附加到整個類上。它們在班級加載時分配。

把這兩者結合在一起,你可以得到一個static final這個類的變量。這基本上意味着分配給變量的值一旦被賦值是恆定的,並且它將被附加到類而不是類的實例。

1

變量不是被實例化的變量。類被實例化。變量被初始化。實例變量必須在構造對象時初始化,並且如果它們是final,您將無法爲其重新分配值。如果它是一個實例變量,那麼每個類的實例將擁有它自己的副本,否則如果它是靜態的,那麼將只有一個副本屬於類本身。

+0

是的,但對於非原始字段,它所引用的對象被實例化。 – Bohemian

+0

@Bohemian:但仍然是實例化的對象而不是引用該對象的變量。 –

4

final修飾符只是表示該變量可以被分配一次並且永不再次。它對實例化沒有影響;規則與正常變量相同。所有final修飾符都會阻止該值第二次分配。

下面的例子。

private final List myList = new ArrayList(); 

該列表將在每次運行時被實例化,即每次封裝類被實例化時。

public void bob() { 
    final List myList = new ArrayList(); 
} 

該列表將每個此運行時實例化,即,每個所述方法bob被調用時。

private static final List MY_LIST = new ArrayList(); 

此外,每次運行時都會實例化列表。因爲這也是一個static字段初始值設定項,所以這個代碼將在第一次加載類時運行。因此,對於簡單程序,這將只運行一次 - 在多個類加載器在使用的情況下(例如應用程序服務器等),但是,每次在新類加載器中加載該類時都會運行一次。

1

實例變量,類變量和局部變量用於引用三個不同的事物,因此調用變量「類的實例變量」或「本地類變量」會造成混淆。

一個實例變量屬於一個對象。無論是否爲final,都會在每個實例中分配空間。如果是final,則必須在施工期間分配一個值,並且該變量只能分配一次。

類變量屬於整個類。只有一個變量,無論該類的對象數量多少,並且所有實例都可以引用它。聲明一個變量爲static意味着它屬於這個類。與實例變量類似,static類變量可以聲明爲final。然後,在初始化類時,它必須被賦值一次且只有一次。

局部變量在方法中聲明,變量佔用方法棧幀—中的空間,儘管該變量可能包含指向堆中對象的指針。局部變量可以是final,這意味着它們只能被分配一次。另外,如果一個局部變量是final,它可以被方法中實例化的內部類引用。