为什么从main读取非静态变量有问题?

String name = "Marcus"; static String s_name = "Peter"; public static void main(String[] args) { System.out.println(name);//ERROR System.out.println(s_name);//OK } 

错误:无法对非静态字段名称进行静态引用

导致问题的原因是main是静态方法,这意味着它没有接收器对象。 换句话说,它不会相对于某个对象运行。 因此,如果您尝试查找非静态字段,那么Java会对该字段所在的对象感到困惑。通常,它会假设该字段位于调用该方法的对象中,但因为main是静态的对象不存在。

作为一般规则,您无法从静态方法访问常规实例变量。

要访问非静态成员变量和函数,您必须具有特定对象。 (例如,如果所有这些都在class Bob { ... } ,你需要做类似的事情

 Bob bob = new Bob(); System.out.println(bob.name); 

在你的主要内部。

在这种情况下,name是一个实例变量,并且您试图在没有创建对象的情况下访问它,因此技术上名称变量在内存中不存在,但对于静态变量(s_name),它是一个类变量,它就会存在一旦创建了类。