Java 匿名线程类无法访问非静态实例变量
我试图访问线程匿名类中的实例变量。我得到一个错误,这里说,使它静态。这里的要点是,如果我可以访问匿名类中的“this”关键字,该类将其视为当前的对象持有者,那么为什么它不能以非静态的方式访问实例变量呢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
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关键字和主类混淆了。对这些例子的赞扬:)