非静态变量不能在静态上下文中被引用| Java Debug 笔记

590 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题:非静态变量不能在静态上下文中被引用

我写下了这样的测试代码:

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);

怎么样使得我的方法可以识别类变量呢?

回答

你必须理解类和该类实例之间的区别。如果你在街上看到一辆车,即使你看不清它的型号或类型,你也能马上知道它是一辆车。这是因为你将所看到的东西与类“car”进行了比较。这个类包含所有类似于汽车的东西。把它当作一个模板或一个想法。

同时,您看到的车是类“car”的一个实例,因为它具有您所期望看到的所有属性:有人在驾驶它,它有一个引擎和轮子。

所以类就是"所有汽车都有一个颜色",而实例就是"这个具体的汽车是红色的"

在面向对象世界中,你定义了类,而在类内部,您定义了一个Color类型的属性。当类被实例化时(当你创建一个具体的实例时),内存会被分配给颜色这个属性,你可以给这个具体的实例一个颜色。因为这些属性是具体的,所以它们是非静态的。

静态属性和方法与所有实例共享。它们用于具体的类的值而不是具体实例的值。对于方法,这通常是全局辅助方法(如Integer.parseInt())。对于字段,它通常是常量(如汽车类型,即来自于一个不经常改变的有限的集合)。

为了解决你的问题,你需要实例化你的类的一个实例(创建一个对象),这样运行时就可以为这个实例分配内存(否则,不同的实例会互相覆盖,这是你不想要的情况)。

在你的代码里,尝试使用下面的代码作为一个开始块:

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

//实例变量

public void run (String[] args) throws Exception
{
   //你的代码
}

新的main()方法创建了它包含的类的一个实例(听起来可能很奇怪,因为main()是用类而不是用实例创建的,所以它可以这样做),然后调用一个实例方法(run())。

文章翻译自Stack Overflow:stackoverflow.com/questions/2…