Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 匿名线程类无法访问非静态实例变量_Java_Multithreading_Concurrency_Static - Fatal编程技术网

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

Java 匿名线程类无法访问非静态实例变量,java,multithreading,concurrency,static,Java,Multithreading,Concurrency,Static,我试图访问线程匿名类中的实例变量。我得到一个错误,这里说,使它静态。这里的要点是,如果我可以访问匿名类中的“this”关键字,该类将其视为当前的对象持有者,那么为什么它不能以非静态的方式访问实例变量呢 public class AnonymousThreadDemo { int num; public AnonymousThreadDemo(int num) { this.num = num; } public static void main

我试图访问线程匿名类中的实例变量。我得到一个错误,这里说,使它静态。这里的要点是,如果我可以访问匿名类中的“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();
    }
}

num
是一个
非静态的
字段,它属于特定实例。您不能直接在
static main
中引用它,因为可以在不创建实例的情况下调用
static
方法

实际上引用的是
线程
,它是一个局部变量,当您执行
运行
时,必须已创建
线程

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

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


查看更多信息。

num
是一个
非静态
字段,它属于特定实例。您不能直接在
static main
中引用它,因为可以在不创建实例的情况下调用
static
方法

实际上引用的是
线程
,它是一个局部变量,当您执行
运行
时,必须已创建
线程

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

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


查看更多信息。

num
是非静态的,这意味着它将位于内存中的static main之后。因此,当main尝试指向
num
时,它在内存中不可用,即它仍然不会被声明。

num
是非静态的,这意味着它将位于内存中的static main之后。因此,当main尝试指向
num
时,它在内存中不可用,即它仍然不会被声明。

我把this关键字与main类混淆了。值得称赞的例子:)我把this关键字和主类混淆了。对这些例子的赞扬:)