当前位置: 首页 > 知识库问答 >
问题:

在Java什么是“范围”?

宰烈
2023-03-14

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

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

共有2个答案

洪星文
2023-03-14

摘自《Java语言规范》第6.3节:

声明的范围是程序的区域,在该区域内,声明所声明的实体可以使用一个简单的名称来引用,前提是它是可见的。

这个范围的概念适用于Java中的许多种类的实体:从局部变量到顶层类和包的一切。即使只是谈论变量,也有很多情况,从局部变量到从另一个类静态导入的字段,再到try语句的catch子句中异常处理程序的参数。有关详细信息,请阅读JLS或在web上搜索“Java范围”,并阅读有关该主题的许多教程中的一个或多个。

彭存
2023-03-14

局部变量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中的tolowercase是合格的)是什么时,Java编译器将依次查找这些位置,直到找到匹配的位置:

    • 对于最内部块中具有该名称的变量
    • 下一个块中具有该名称的变量,依此类推
    • 对于当前类中具有该名称的字段2或方法(通常为:成员)
    • 对于已导入的包中具有该名称的类
    • 对于具有该名称的包

    该列表中还有其他一些(我不打算与初学者讨论静态导入)。

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

    1“局部变量”与“变量”--Java语言规范使用“变量”的方式比大多数人在常用语言中使用的方式更为普遍。当我在这个答案中说“变量”时,我指的是JLS所说的“局部变量”。

    2“字段”-JLS在某些地方将字段称为“变量”(而在其他地方则称为“字段”),因此上面(1)。:-)

  •  类似资料:
    • 问题内容: 我试图了解在多个JavaConfig上下文中放置注释的正确位置在哪里? 考虑以下情形:我在JPAConfig.java和AppConfig.java中具有服务bean集的JPA配置。然后,在RootConfig.java中编写整个应用程序配置。 我在JPAConfig.java中定义事务管理器,并启用对JPA存储库的扫描- 当这些暴露事务行为时,我将其放到JPAConfig上,并且它可

    • 问题内容: 如果输入: 默认范围是什么? 上市?受保护?私人的? 问题答案: 默认范围是package-private。同一包中的所有类都可以访问方法/字段/类。私有包比受保护的范围和公共作用域严格,但比私有作用域更宽松。 详细信息: http //docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html http://mindp

    • 问题内容: 什么是词汇作用域简介? 问题答案: 我通过示例了解它们。:) 首先,采用类似C的语法的 词汇作用域 (也称为 静态作用域 ): 每个内部级别都可以访问其外部级别。Lisp的第一个实现使用另一种称为动态范围的方式,再次使用类似C的语法: 在这里既可以访问的或,或在调用任何函数与在其声明。 将打印5 将打印10。 第一个称为静态,因为它可以在编译时推导,第二个称为动态,因为外部范围是动态的

    • 1、列不可再分; 2、每一行数据只做一件事,只与一列相关,主键; 3、每个属性都与主键有直接关系,而不是间接关系; 三大范式只是设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情结,当然要特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构。 所以不能一味的追求三范式建立数据库。

    • 问题内容: 我已经看到了声明,接口和类 这是什么意思? 问题答案: 没有证据,我相信您在谈论Java的泛型支持… 泛型允许您抽象类型 在Java 5之前,很难提供能够支持多种不同类型的Objects的类而不必为每种特定情况编写代码,因此人们通常会这样做。 这导致在运行时做出许多困难的选择,您必须进行运行时检查以查看是否有可能将给定的Object强制转换为可用类型…例如 现在,这已经很明显了,但是如

    • 主要内容:什么是Java语言,Java语言的特点Java 是近 10 年来计算机软件发展过程中的传奇,其在众多开发者心中的地位可谓“爱不释手”,与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同,Java 随着时间的推移反而变得更加强大。 从首次发布开始,Java 就跃到了 Internet 编程的前沿。后续的每一个版本都进一步巩固了这一地位。如今,Java 依然是开发基于 Web 的应用程序的最佳选择。此外,Java 还是智能手机变革的推手