匿名线程类无法访问非静态实例变量

时间:2018-05-03 04:04:12

标签: java multithreading concurrency static

我正在尝试访问Thread匿名类中的实例变量。我在这里得到一个错误,说它是静态的。这里的重点是,如果我可以在匿名类中访问“this”关键字,将其视为当前的对象持有者,那么为什么它不能以非静态方式访问实例变量。

public class AnonymousThreadDemo {
    int num;

    public AnonymousThreadDemo(int num) {
        this.num = num;
    }

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("Anonymous " + num); // Why cant we access num instance variable
                System.out.println("Anonymous " + this); // This can be accessed in a nonstatic way
            }
        };
        thread.start();
    }
}

2 个答案:

答案 0 :(得分:1)

numnon static字段,它属于特定实例。您无法直接在static main中引用它,因为可以在不创建实例的情况下调用static方法。

this实际上是引用thread,它是一个局部变量,当您执行run时,必须创建thread

如果您在AnonymousThreadDemo.this中尝试引用main,您将获得相同的结果:

public static void main(String[] args) {
    Thread thread = new Thread() {

        @Override
        public void run() {
            System.out.println("Anonymous " + AnonymousThreadDemo.this); // compile error
        }
    };
    thread.start();
}

没关系,你可以在本地类中引用一个局部变量:

public static void main(String[] args) {
    int num = 0;

    Thread thread = new Thread() {
        @Override
        public void run() {
            System.out.println("Anonymous " + num);
        }
    };
    thread.start();
}

没关系,您可以在其方法中引用非静态本地类字段:

public static void main(String[] args) {
    Thread thread = new Thread() {
        int num = 0;

        @Override
        public void run() {
            System.out.println("Anonymous " + num);
        }
    };
    thread.start();
}

查看this了解更多信息。

答案 1 :(得分:1)

num是非静态的,这意味着它将在内存中的静态main之后出现。因此当main将尝试指向num时,它将无法在内存中使用,即。它还没有被宣布。