我正在测试下面的代码片段,我需要知道如何访问 t.x 或 t.hello?它的范围是什么? 开发者会这样定义变量吗?
public class Test{
public Test(){
System.out.print("constructor\n");
}
public static void main(String[] args) {
Test t = new Test(){
int x = 0;
//System.out.print("" + x);
void hello(){
System.out.print("inside hello\n");
}
};
}
编辑
但是为什么这段代码有效
Thread tr = new Thread() {
int loops = 1;
@Override
public void run() {
loops += 1;
}
};
tr.start();
最佳答案
你应该区分声明和定义。
在你的例子中,你声明了一个 Test
类的变量,并将它分配给派生自 Test
的某个类的对象(它是一个匿名类),它有一些额外的东西
此定义后的代码只看到 Test
类的 t
,它对 x
和 hello
一无所知因为 Test
没有它们。
因此,除了反射之外,您不能在定义匿名类之后使用x
和hello
。是的,当开发人员在定义中需要这些变量时,他们会使用这些变量。
有人提到您可以在定义后立即调用不属于 Test
的方法和访问变量:
int y = new Test(){
int x = 0;
//System.out.print("" + x);
void hello(){
System.out.print("inside hello\n");
}
}.x;
这是可以做到的,因为此时对象的类型是已知的(它是匿名类)。一旦您将此对象分配给 Test t
,您就会丢失此信息。
关于java - 实例的局部变量/方法的范围是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14186239/