This question already has answers here:
Java - No enclosing instance of type Foo is accessible

(7个答案)


7年前关闭。




整个代码是:
public class ThreadLocalTest {
    ThreadLocal<Integer> globalint = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return new Integer(0);
        }
    };


    public class MyThread implements Runnable{
        Integer myi;
        ThreadLocalTest mytest;

        public MyThread(Integer i, ThreadLocalTest test) {
            myi = i;
            mytest = test;
        }

        @Override
        public void run() {
            System.out.println("I am thread:" + myi);
            Integer myint = mytest.globalint.get();
            System.out.println(myint);
            mytest.globalint.set(myi);
        }
    }


    public static void main(String[] args){
        ThreadLocalTest test = new ThreadLocalTest();
        new Thread(new MyThread(new Integer(1), test)).start();
    }
}

为什么使用以下代码段:
ThreadLocalTest test=new ThreadLocalTest();
    new Thread(new MyThread(new Integer(1),test)).start();

导致以下错误:



核心问题是:
我想在静态方法中初始化内部类。
这是两个解决方案:
  • 使内部类成为外部类
  • 使用外部引用,例如:
  • new Thread(test.new MyRunnable(test)).start();//Use test object to create new

    最佳答案

    如果将MyThread类更改为静态,则可以消除此问题:

    public static final class MyThread implements Runnable
    

    由于main()方法是静态的,因此如果不先创建封闭类的实例,就不能依赖于封闭类的非静态类型或字段。更好的是,甚至不需要这种访问,这是通过使相关类为静态来实现的。

    10-08 04:31