Java中的“范围”是啥?
Posted
技术标签:
【中文标题】Java中的“范围”是啥?【英文标题】:What is 'scope' in Java?Java中的“范围”是什么? 【发布时间】:2021-11-23 03:45:08 【问题描述】:我刚开始编码。我想对同一个变量使用两次 switch 语句,我被告知要这样做,变量必须在“范围内”。
作为初学者,我不知道这意味着什么。那么在范围内是什么意思呢?而且,如果变量不在范围内,我如何使其在范围内?
【问题讨论】:
请看here @npinti 你打败了我哈哈。无论如何,对于 OP,就目前而言,您的问题将被关闭,因为它确实是太广泛了。请参阅How to ask,了解可以在这里询问的内容。 长话短说:变量的范围定义了变量可见的代码部分。通常,在块内定义的变量在该块外是不可访问的。您可以通过查看上面发布的链接了解这意味着什么,这并不难。 Java scope and lifetime of variable的可能重复 你有没有尝试搜索java variable scope
?
【参考方案1】:
如果代码可以访问局部变量1,则它是“在范围内”,如果不能访问,则在范围外。在 Java 中,变量的作用域是声明它们的块 ()。所以:
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
,它们是合格的 em>) 是,Java 编译器将依次查找这些位置中的每一个,直到找到匹配项:
该列表还有其他几个(我不打算与初学者一起进入静态导入)。
还有更多内容,我建议阅读一些教程和/或一本 Java 入门书籍以了解更多信息。
1 “局部变量”与“变量” - Java Language Specification 使用“变量”的方式比大多数人在普通语音中的使用方式更普遍。当我在这个答案中说“变量”时,我的意思是 JLS 所说的“本地变量”。
2 “field” - JLS 在某些地方将字段称为“变量”(而在其他地方称为“fields”),因此上面的 (1)。 :-)
【讨论】:
我认为范围和可访问性根本不是一回事。 “范围”的关键是该变量可以通过不合格名称来引用。因此,公共类A
中的公共静态变量a
可以通过A.a
从类B
(即在单独的编译单元中)中的代码访问,但a
不在类@ 的范围内987654344@ 除非是静态导入到B
的编译单元中。
@TedHopp:variables 是等价的,这就是上面的答案主要涵盖的内容。我将在最后澄清列表,我确实在谈论不合格的标识符。
我认为您使用术语 variable 的方式与 JLS 一致。例如,Section 4.12.3 标识了八种变量,包括类和实例变量(分别称为static
和非static
字段)。在谈论这些类型的变量时,范围和访问之间没有等价性。但我同意 OP 可能是在谈论局部变量,在这种情况下是等价的。
@TedHopp:我倾向于忘记 JLS 使用“变量”,而我们大多数人使用“字段”,谢谢。 (前几天我也被提醒了!)我将上面的内容更新为 局部变量。【参考方案2】:
来自Section 6.3 of the Java Language Specification:
声明的范围是程序的区域,在该区域内,声明所声明的实体可以使用简单名称来引用,前提是它是可见的。
范围的这个概念适用于Java中的多种实体:从局部变量到***类和包的一切。即使只是谈论变量,也有很多情况,从局部变量到从另一个类静态导入的字段,再到 try
语句的 catch
子句中的异常处理程序的参数。有关详细信息,请阅读 JLS 或在 Web 上搜索“Java 范围”并阅读出现的有关该主题的众多教程中的一个或多个。
【讨论】:
以上是关于Java中的“范围”是啥?的主要内容,如果未能解决你的问题,请参考以下文章