最近我遇到了这个错误
“无法从静态上下文引用非静态变量”
我在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";
}
}
答案 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作为模板创建的对象上访问非静态变量。