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 没有在块或包含它的任何块(或其他一些东西)中声明。

当找出什么是不合格的标识符时(例如上面的aq,而不是this.foo 中的fooq.toLowerCase 中的toLowerCase,它们是合格的 em>) 是,Java 编译器将依次查找这些位置中的每一个,直到找到匹配项:

对于在最里面的块中具有该名称的变量 对于在下一个块中具有该名称的变量,等等 对于当前类中具有该名称的字段2方法(通常为:成员) 对于已导入包中具有该名称的类 对于具有该名称的包

该列表还有其他几个(我不打算与初学者一起进入静态导入)。

还有更多内容,我建议阅读一些教程和/或一本 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中的“范围”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中方法的默认范围是啥?

JAVA中,类的缺省访问范围是啥

java中的代理是啥意思?

请问java中的基本数据类型中的字节型( byte ) 是啥概念,请列举几个byte型的常量,谢!

c++中的引用范围是啥? [复制]

运行时错误中的“值不在预期范围内”是啥意思?