2014-01-15 138 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

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