3

我在静态与非静态的概念上苦苦挣扎。我正在研究这个 Thread 示例程序(已修改,最初来自这里),当我使用内部类时,我会得到错误:

Error: non-static variable this cannot be referenced from a static context

这是导致错误的代码:

public class Main2 {
    public static void main(String[] args) {
        Thread simple = new Thread(new SimpleTask());
        simple.start();
    }


    class SimpleTask implements Runnable {
        public void run() {

        }

        ;
    }

    class DaemonTask implements Runnable {
        public void run() {
            int i = 0;
        }
    }

}

但是,当我将它分解为 3 个类时,没有错误.. 即如果我成功了:

public class Main2 {  
   /* contents */  
}

class SimpleTask implements Runnable {
   /* contents */
}

class DaemonTask implements Runnable {
   /* contents */
}

然后它编译就好了。为什么我们把它分成另一个类很重要?

4

5 回答 5

4

您需要一个外部类实例(Main2)来访问内部类实例(SimpleTask)。

试试这个:

    Thread simple = new Thread(new Main2().new SimpleTask());

检查Oracle 路径上的内部类

于 2013-03-22T17:01:15.373 回答
3

因为您的类是非静态内部类;他们隐含地需要外部类的相应实例。

将您的内部类声明为static,您的问题应该会消失。

于 2013-03-22T16:59:01.363 回答
1

SimpleTask并且DemonTask类应该是静态的


Instance members(在您的情况下SimpleTaskDemonTask)与类的特定对象相关联。因此您不能直接在静态方法中使用实例成员(因为静态成员没有关于类实例的任何信息,除非您将实例本身传递为范围)

您必须创建一个对象Main2并访问SimpleTaskDemonTask通过它new Main2().new SimpleTask()

或者

使这两个类静态

于 2013-03-22T16:59:12.927 回答
1

尝试制作class SimpleTask implements Runnable静态。

当你声明一个这样的类时,你是在声明一个每个实例的类定义。更准确地说,您将 的类定义绑定SimpleTask到的实例Main2

为了实例化该类的对象,您将执行以下操作:

Main2 obj = new Main2();
SimpleTask t = obj.new SimpleTask();

注意使用obj.new. 当您从外部类内部调用它时,您实际上是在调用this.new. 静态方法不知道this,所以你得到一个错误。

于 2013-03-22T16:59:13.133 回答
1

问题在于“Thread simple = new Thread(new SimpleTask());”这一行 由于类 SimpleTask 被定义为嵌套类,因此您需要外部类的对象来创建一个(构造函数本质上需要对包含类的隐式引用,类似于普通方法如何获得对当前类实例的隐式引用'这')。您在这里实质上要求的是“Thread simple = new Thread(null.new SimpleTask());” 正是这个'null'导致了异常。

于 2013-12-04T23:28:48.990 回答