Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是';范围';在爪哇?_Java - Fatal编程技术网

Java 什么是';范围';在爪哇?

Java 什么是';范围';在爪哇?,java,Java,我刚开始编码。我想对同一个变量使用一个switch语句两次,我被告知要这样做,变量必须是“在范围内” 作为一个初学者,我不知道那意味着什么。那么,在范围内意味着什么呢?如果一个变量不在作用域内,我如何使它在作用域内?如果代码可以访问它,则局部变量1在作用域内;如果代码不能访问它,则在作用域外。在Java中,变量的作用域是它们在其中声明的块({})。因此: void foo() { int a = 42; if (/*some condition*/) { Str

我刚开始编码。我想对同一个变量使用一个switch语句两次,我被告知要这样做,变量必须是“在范围内”

作为一个初学者,我不知道那意味着什么。那么,在范围内意味着什么呢?如果一个变量不在作用域内,我如何使它在作用域内?

如果代码可以访问它,则局部变量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
    中的
    toLowerCase
    ,它们是限定的)是什么时,Java编译器将逐个查找这些位置,直到找到匹配项:

    • 对于最内层块中具有该名称的变量
    • 对于下一个块中具有该名称的变量,依此类推
    • 对于当前类中具有该名称的field2或方法(通常为:member)
    • 对于已导入的包中具有该名称的类
    • 对于具有该名称的包
    这个列表还有一些其他内容(我不打算和初学者一起讨论静态导入)

    还有更多的范围,我建议通过一些教程和/或一本Java入门书了解更多内容


    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使用“变量”,而我们大多数人使用“字段”,谢谢。(前几天我也被提醒过!)我将更新上面的内容,称为局部变量。