小编典典

实例的局部变量/方法的范围是什么

java

我正在测试下面的代码段,我需要知道如何访问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();

阅读 191

收藏
2020-11-26

共1个答案

小编典典

您应该区分声明和定义。

在您的情况下,您声明一个class变量,Test并将其分配给派生自某个类的对象Test(这是一个匿名类),该对象中包含一些其他内容。

此定义之后的代码仅看到tTest,它对此一无所知xhello因为Test没有它们。

因此,除了反射之外,您不能使用匿名类xhello在定义之后。是的,开发人员在定义中需要这些变量时会使用此类变量。

提到您可以Test在定义后立即调用不属于其中的方法和访问变量:

int y = new Test(){
    int x = 0;
    //System.out.print("" + x);
    void hello(){
        System.out.print("inside hello\n");
    }
}.x;

可以这样做是因为在这一点上,对象的类型是已知的(这是匿名类)。一旦将此对象分配给Test t,就会丢失此信息。

2020-11-26