我正在测试下面的代码段,我需要知道如何访问tx或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();
您应该区分声明和定义。
在您的情况下,您声明一个class变量,Test并将其分配给派生自某个类的对象Test(这是一个匿名类),该对象中包含一些其他内容。
Test
此定义之后的代码仅看到t类Test,它对此一无所知x,hello因为Test没有它们。
t
x
hello
因此,除了反射之外,您不能使用匿名类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,就会丢失此信息。
Test t