我正在测试下面的代码段,我需要知道如何访问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
(这是一个匿名类),该对象中包含一些其他内容。
此定义之后的代码仅看到t
类Test
,它对此一无所知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
,就会丢失此信息。
问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实
问题内容: 我知道变量作用域由块的开始和块的结尾包围。如果在块内声明了相同的变量,则会发生编译错误。但是,请看以下示例。 在这里,可以在方法中重新声明,尽管它已经在类中声明了。但是在块中,无法重新声明。 为什么类范围变量的重新声明不产生错误,而方法范围变量的重新声明却产生错误? 问题答案: 这是因为不是变量,而是实例字段。允许局部变量与字段具有相同的名称。为了区分变量和具有相同名称的字段,我们在实
问题内容: javascript中变量的范围是什么?它们在函数内部和外部的作用域是否相同?还是有关系吗?另外,如果变量是全局定义的,则将变量存储在哪里? 问题答案: TLDR JavaScript具有词汇(也称为静态)作用域和闭包。这意味着您可以通过查看源代码来确定标识符的范围。 四个范围是: 全球-一切可见 功能-在功能(及其子功能和块)中可见 块-在块(及其子块)中可见 模块-在模块内可见 在
问题内容: 我有一个关于变量范围的相当简单的问题。 我对增强型循环很熟悉,但是我不明白为什么我应该声明一个新变量来保留每个元素。一个例子可以澄清我的问题: 那为什么要声明这个新变量呢?毕竟在for循环内是可访问的。我不想使用任何先前的值,只是不想声明一个新变量。(我猜想对于其他可迭代项,使用相同变量可能会更快)。 我想这就是增强型循环的构建方式,但这不会破坏整个范围的想法吗? 上述行为引起了一个问
问题内容: Spring-MVC中的所有控制器是否都是单例的,并且在不同的会话和请求之间共享? 如果是这样,我假设一个类变量像 所有请求和会话都一样吗?这样,如果用户X发出请求name并被设置为Paul,那么用户Z也具有Paul作为属性吗? 就我而言,我不希望这种行为,但想知道是否有更简单或更干净的OOP方式来拥有会话/请求变量,然后 问题答案: 要回答你的第一个问题:是的,Spring MVC控
问题内容: 除了范围和存储差异外,java中实例变量和局部变量之间是否还有其他主要区别? 问题答案: 我能想到的一件事: 实例变量具有默认值,即如果为对象引用,则为null;如果为int,则为0。 局部变量不会获取默认值,因此需要进行显式初始化(如果您未这样做,则编译器通常会抱怨)。