不能从静态上下文中引用非静态变量

我写了这个测试代码:

class MyProgram
{
    int count = 0;
    public static void main(String[] args)
    {
        System.out.println(count);
    }
}

但它给出了以下错误:

Main.java:6: error: non-static variable count cannot be referenced from a static context
        System.out.println(count);
                           ^

如何让我的方法识别我的类变量?


答案 1

您必须了解类与该类的实例之间的区别。如果你在街上看到一辆汽车,即使你看不到哪个型号或类型,你也会立即知道它是一辆汽车。这是因为您将所看到的与“汽车”进行比较。该类包含与所有汽车相似的内容。把它想象成一个模板或一个想法。

同时,您看到的汽车是“汽车”类的一个实例,因为它具有您期望的所有属性:有人驾驶它,它有发动机,车轮。

因此,该类说“所有汽车都有颜色”,实例说“这辆特定的汽车是红色的”。

在 OO 世界中,定义类,在类内部定义类型字段。实例化类时(创建特定实例时),将为颜色保留内存,您可以为此特定实例指定颜色。由于这些属性是特定的,因此它们是非静态的。Color

静态字段和方法与所有实例共享。它们用于特定于类而不是特定实例的值。对于方法,这通常是全局帮助程序方法(如 )。对于字段,它通常是常量(如汽车类型,即您有一个不经常更改的有限集合)。Integer.parseInt()

为了解决您的问题,您需要实例化类的实例(创建一个对象),以便运行时可以为该实例保留内存(否则,不同的实例将相互覆盖,这是您不希望的)。

在本例中,请尝试将此代码作为起始块:

public static void main (String[] args)
{
    try
    {
        MyProgram7 obj = new MyProgram7 ();
        obj.run (args);
    }
    catch (Exception e)
    {
        e.printStackTrace ();
    }
}

// instance variables here

public void run (String[] args) throws Exception
{
    // put your code here
}

新方法创建它所包含的类的实例(听起来很奇怪,但由于是使用类而不是实例创建的,因此它可以执行此操作),然后调用实例方法()。main()main()run()


答案 2

静态字段和方法连接到类本身,而不是连接到其实例。如果你有一个类,一个“正常”(通常称为实例)方法,和一个静态方法,并且你做了一个类的实例,对和的调用是有效的。方法不知道哪个实例是连接的,因此它不能使用非静态字段。AbcaAA.c()a.b()c()

解决方案是使字段成为静态字段或方法非静态。您的主节点可能如下所示:

class Programm {

    public static void main(String[] args) {
        Programm programm = new Programm();
        programm.start();
    }

    public void start() {
        // can now access non-static fields
    }
}