我正在尝试访问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();
}
}
答案 0 :(得分:1)
num
是non 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
时,它将无法在内存中使用,即。它还没有被宣布。