Java 为什么非静态变量不能在静态方法内初始化?

Java 为什么非静态变量不能在静态方法内初始化?,java,variables,static,initialization,static-variables,Java,Variables,Static,Initialization,Static Variables,最近我遇到了这个错误 “无法从静态上下文引用非静态变量” 在这里,我初始化了main方法中的所有变量,这是一个static方法。但是在使所有变量静态后,它编译时没有错误。谁能解释一下为什么会这样 public class Test2 { String[] mycharset; String chkfor; public static void main(String[] args){ mycharset = new String[5]; chkfor = "k";

最近我遇到了这个错误

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

在这里,我初始化了main方法中的所有变量,这是一个
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";
    }
}

为了开始解释这一点,我必须从一些基本的事情开始

基于类创建对象时,
newtest2()
,对象将有自己的变量,这些变量在顶部声明,
String[]mycharset
字符串chkfor

当您将某个对象声明为静态时,它将不会被视为基于类创建的对象的成员,而是实际类本身的成员

如果你的班级是这样的:

public class Test2 {
    String[] array;
    static String text;
}
然后创建了Test2类的两个实例,两个不同的对象

Test2 a = new Test2();
Test2 b = new Test2();
然后a和b将有自己的数组变量,但它们将共享相同的文本变量

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

对问题的回答:

您得到的警告/错误都是由于上述解释造成的。 主方法是静态的,因此属于类。 运行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类作为模板创建的对象上访问非静态变量

因为你需要那个类的一个实例。。。实例变量属于对象,静态方法属于类,您需要
newtest2().chkfor='k'
并阅读@MarkoTopolnik yes…我为我的评论道歉。。!!非常感谢您给出清晰易懂的答案