当前位置: 首页 > 面试题库 >

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

禄烨然
2023-03-14
问题内容

我正在测试下面的代码段,我需要知道如何访问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(这是一个匿名类),该对象中包含一些其他内容。

此定义之后的代码仅看到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,就会丢失此信息。



 类似资料:
  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实

  • 问题内容: javascript中变量的范围是什么?它们在函数内部和外部的作用域是否相同?还是有关系吗?另外,如果变量是全局定义的,则将变量存储在哪里? 问题答案: TLDR JavaScript具有词汇(也称为静态)作用域和闭包。这意味着您可以通过查看源代码来确定标识符的范围。 四个范围是: 全球-一切可见 功能-在功能(及其子功能和块)中可见 块-在块(及其子块)中可见 模块-在模块内可见 在

  • 问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问

  • 问题内容: Spring-MVC中的所有控制器是否都是单例的,并且在不同的会话和请求之间共享? 如果是这样,我假设一个类变量像 所有请求和会话都一样吗?这样,如果用户X发出请求name并被设置为Paul,那么用户Z也具有Paul作为属性吗? 就我而言,我不希望这种行为,但想知道是否有更简单或更干净的OOP方式来拥有会话/请求变量,然后 问题答案: 要回答你的第一个问题:是的,Spring MVC控

  • 问题内容: 除了范围和存储差异外,java中实例变量和局部变量之间是否还有其他主要区别? 问题答案: 我能想到的一件事: 实例变量具有默认值,即如果为对象引用,则为null;如果为int,则为0。 局部变量不会获取默认值,因此需要进行显式初始化(​​如果您未这样做,则编译器通常会抱怨)。