2014-01-15 127 views
-1

最近我遇到了這個錯誤爲什麼非靜態變量不能在靜態方法內初始化?

,我曾在我的主要方法,這是一個static方法初始化所有的變量「非靜態變量不能從靜態上下文中引用」。但是在做出所有變量之後static它編譯時沒有錯誤。請任何人都可以解釋爲什麼會發生這種情況?

public class Test2 { 

String[] mycharset; 
String chkfor; 


public static void main(String[] args){ 
    mycharset = new String[5]; 
    chkfor = "k"; 
    mycharset[0] = "a"; 
    mycharset[1] = "b"; 
    mycharset[2] = "c"; 
    mycharset[3] = "d"; 
    mycharset[4] = "e"; 
    } 
} 
+1

因爲您需要該類的實例...實例變量屬於對象,靜態方法屬於類,您需要'new Test2()。chkfor ='k'' – nachokk

+1

並閱讀http://docs.oracle .com/javase/tutorial/java/javaOO/classvars.html –

+0

@MarkoTopolnik是的...我爲我的評論道歉。 –

回答

2

要開始解釋這一點,我將不得不從一些基本的東西開始。

當製作基於一類,new Test2()一個對象,你的對象也有是在頂部聲明它自己的變量,String[] mycharset;String chkfor;

當你聲明爲靜態的東西,那麼它被視爲不是基於您的類創建的對象的成員,而是作爲實際類本身的成員。

所以,如果你的類是這樣的:

public class Test2 { 
    String[] array; 
    static String text; 
} 

,然後你所做的的Test2類的2個實例,2個不同的對象。

Test2 a = new Test2(); 
Test2 b = new Test2(); 

然後a和b會有自己的數組變量,但他們會共享相同的文本變量。

這與方法相同。當你有一個靜態方法時,它由類「擁有」,而非靜態方法由基於類的對象「擁有」。

這個問題:

你得到的警告/錯誤都是由於上述解釋。 主要方法是靜態的,因此屬於類。 當您運行main-method時,只有靜態方法和變量已經啓動。

如果您想在Test2中啓動非靜態的變量,那麼您將不得不使用Test2創建一個對象。

所以,你可以做什麼,而不是使變量靜態如下:

public class Test2 { 

String[] mycharset; 
String chkfor; 


public static void main(String[] args){ 
    Test2 myTest = new Test2(); 
     myTest.mycharset = new String[5]; 
     myTest.chkfor = "k"; 
     myTest.mycharset[0] = "a"; 
     myTest.mycharset[1] = "b"; 
     myTest.mycharset[2] = "c"; 
     myTest.mycharset[3] = "d"; 
     myTest.mycharset[4] = "e"; 
    } 
} 

通過做這種方式,你直接訪問您已與創建的對象的非靜態變量Test2-class作爲模板。

+0

非常感謝您提供清晰可理解的答案 –