Java 什么是';范围';在爪哇?
我刚开始编码。我想对同一个变量使用一个switch语句两次,我被告知要这样做,变量必须是“在范围内” 作为一个初学者,我不知道那意味着什么。那么,在范围内意味着什么呢?如果一个变量不在作用域内,我如何使它在作用域内?如果代码可以访问它,则局部变量1在作用域内;如果代码不能访问它,则在作用域外。在Java中,变量的作用域是它们在其中声明的块(Java 什么是';范围';在爪哇?,java,Java,我刚开始编码。我想对同一个变量使用一个switch语句两次,我被告知要这样做,变量必须是“在范围内” 作为一个初学者,我不知道那意味着什么。那么,在范围内意味着什么呢?如果一个变量不在作用域内,我如何使它在作用域内?如果代码可以访问它,则局部变量1在作用域内;如果代码不能访问它,则在作用域外。在Java中,变量的作用域是它们在其中声明的块({})。因此: void foo() { int a = 42; if (/*some condition*/) { Str
{}
)。因此:
void foo() {
int a = 42;
if (/*some condition*/) {
String q = "Life, the Universe, and Everything";
// 1. Both `a` and `q` are in scope here
System.out.println(a);
System.out.println(q);
if (/*another condition*/) {
// 2. Both `a` and `q` are in scope here, too
System.out.println(a);
System.out.println(q);
}
}
// 3. Only `a` is in scope here
System.out.println(a);
System.out.println(q); // ERROR, `q` is not in scope
}
上述注释(1)、(2)和(3):
q
,因为q
与代码在同一块中声明;tt可以访问a
,因为它是在包含块中声明的q
,因为它是在包含块中声明的;它可以访问a
,因为它在下一个块中a
,但不能访问q
,因为q
未在块或包含它的任何块(或两个其他对象)中声明a
或q
,而不是this.foo
中的foo
或q.toLowerCase
中的toLowerCase
中的toLowerCase
,它们是限定的)是什么时,Java编译器将逐个查找这些位置,直到找到匹配项:
- 对于最内层块中具有该名称的变量
- 对于下一个块中具有该名称的变量,依此类推
- 对于当前类中具有该名称的field2或方法(通常为:member)
- 对于已导入的包中具有该名称的类
- 对于具有该名称的包
1“局部变量”与“变量”——与大多数人在普通语言中使用“变量”相比,使用“变量”的方式更为普遍。当我在这个答案中说“变量”时,我指的是JLS所称的“局部变量” 2“字段”-JLS在某些位置调用字段“变量”(在其他位置调用字段),因此(1)如上所述: 来自: 声明的范围是程序的一个区域,在该区域内,只要声明声明的实体是可见的,就可以使用简单的名称引用该实体
这个作用域的概念适用于Java中的多种实体:从局部变量到顶级类和包,无所不包。即使只是谈论变量,也有很多情况,从局部变量到从另一个类静态导入的字段,再到
try
语句的catch
子句中异常处理程序的参数。有关详细信息,请阅读JLS或在web上搜索“Java scope”,并阅读一个或多个出现的关于该主题的教程。请看一看@npinti you best me to it lol。无论如何,对于OP,就目前的情况而言,您的问题将被关闭,因为它太宽泛了。请参阅此处询问的问题。长话短说:变量的作用域定义了代码中变量可见的部分。通常,块内定义的变量在该块外是不可访问的。你可以通过查看上面的链接来了解这意味着什么,这并不太难。你有没有尝试过搜索的可能重复?我认为范围和可访问性根本不是一回事。“范围”的关键是变量可以被非限定名称引用。因此,公共类a
中的公共静态变量a
可以通过a.a
从类B
中的代码(即在单独的编译单元中)访问,但是a
不在类B
的范围内,除非它被静态地导入到B
的编译单元中。@TedHopp:变量有一个等价性,这就是上面的答案主要涉及的。我会在最后澄清这个列表,我确实是在说不合格的标识符。我不认为您使用术语变量的方式与JLS一致,例如,标识八种类型的变量,包括类和实例变量(即分别为静态
和非静态
字段)。在讨论这些类型的变量时,范围和访问之间没有等价性。但我同意OP可能是在谈论局部变量,在这种情况下,就有一个等价性。@TedHopp:我倾向于忘记JLS使用“变量”,而我们大多数人使用“字段”,谢谢。(前几天我也被提醒过!)我将更新上面的内容,称为局部变量。