为什么无法在静态方法中初始化非静态变量?

时间:2014-01-15 13:16:05

标签: java variables static initialization static-variables

最近我遇到了这个错误

“无法从静态上下文引用非静态变量”

我在main方法中初始化了所有变量,这是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 个答案:

答案 0 :(得分:2)

要开始解释这一点,我将从一些基本的事情开始。

根据类new Test2()制作对象时,您的对象将拥有自己在顶部声明的变量,String[] mycharset;String chkfor;

当你将某些东西声明为静态时,它将被视为不是基于你的类创建的对象的成员,而是作为实际类本身的成员。

所以如果你的课看起来像这样:

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

然后你创建了2个Test2级实例,2个不同的对象。

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

然后a和b将拥有自己的数组变量,但它们将共享相同的文本变量。

在方法方面也是如此。当你有一个静态方法时,它由类“拥有”,而非静态方法由基于类的对象“拥有”。

问题:

您收到的警告/错误均归因于上述说明。 main方法是静态的,因此属于类。 运行main方法时,只启动了静态方法和变量。

如果要在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作为模板创建的对象上访问非静态变量。