2010-01-13 67 views
0

爲什麼不能在靜態變量中訪問最終變量。 在編譯時它們被簡單地直接替換爲它們的值 ,所以它們應該被允許在靜態方法中使用最終變量可訪問性

爲什麼這個限制?

+1

你想舉個例子嗎? – 2010-01-13 19:58:48

回答

2

並非所有的final變量都是編譯時間常量。只有static final變量可以被編譯器替換爲編譯時常量。在某些情況下,final修飾符僅用於確保const-correctness

static方法不能訪問非靜態變量,因爲這些變量對同一類的不同實例可能具有不同的值。

1

如果你問爲什麼static方法不能訪問final實例變量(在[不正確]的假設下,最終成員變量總是在代碼中設置爲文字或常量值),因爲一個類的不同實例可以爲相同的實例變量(可以通過構造函數設置)設置不同的值。一個static方法不知道該類的任何特定實例,並且只能訪問static final變量。

3

static =在課堂上。

final =不改變它的值(但它是每個實例,如果它不是靜態的)。

通過examply你可以這樣做:

public class Weird 
{ 
private static long number = System.getTimeInMilis(); 
private final long created = System.getTimeInMilis(); 
} 

每次創建一個奇怪的物體會包含不同的價值創造。

但Weird.number的值將是加載類的時間。

+0

一個更真實的例子:你可以創建一個「private final list = new ArrayList <...>」,你不會改變列表的引用,但是列表可以在需要時添加對象。 – helios 2010-01-13 20:01:43

+1

...在賦值後不會更改值*。這是編譯器強制執行的,而不是jvm強制執行的 – 2010-01-13 21:21:52