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

标签 java scope

我正在测试下面的代码片段,我需要知道如何访问 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,它对 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,您就会丢失此信息。

关于java - 实例的局部变量/方法的范围是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14186239/

相关文章:

java - android recyclerview 首次启动时未加载

php - Require_once 跨不同文件,全局作用域

ruby - 方法中临时变量的惯用 ruby

r - 如何限制脚本中使用的变量的范围?

javascript - ExtJS - 如何在自定义类的自定义函数中引用 "self"?

java - 如何获取 android 命名空间中的所有类?

java - 在 Eclipse 中更改应用程序名称

java - 如何设置 javac 编译器标志来生成 1.7 字节码?

JavaFX RadioButton 无法正常工作?

C# 析构函数在超出范围后不调用