【问题标题】:What does the '{' symbol (curly-brace) indicate in Java?Java 中的“{”符号(大括号)表示什么?
【发布时间】:2017-05-04 21:38:45
【问题描述】:

我目前正在学习 Java,并且收到了一个似乎无法简单回答的问题:

以下符号在Java中是什么意思:{

当然,也有共同的含义:if 语句的主体、for 循环、其他控制结构。但它也可能是一个方法的开始,或者是一个初始化器——这些似乎没有什么共同点。

我花了很多时间在 Java 上下文中搜索此符号的单个定义,但在这里没有找到任何足够的东西。

什么是 Java 中左大括号表示的包罗万象的定义?

【问题讨论】:

标签: java parsing


【解决方案1】:

在 Java 中,当您打开一个花括号时,这意味着您打开了一个新的 作用域(通常它是一个嵌套作用域)。要理解的一件重要事情是,您将在此范围内定义的变量(在您放置右花括号的位置结束)将不会在范围之外被识别。

另一种方式不正确:如果您在范围之外定义一个变量,然后打开一个新变量,则将从嵌套范围内识别该变量。

例子:

int k = 5;
if (true) { //opening a new scope 
    // k is recognized here!
    int i = 10;
}
// here i is not recognized

花括号在某些情况下是强制性的,例如:

  • 类声明
  • 方法声明

有时它是可选的,例如:

  • 遵循ifwhilefor 语句

还有许多其他使用花括号的情况:嵌套类、匿名类、初始化程序、静态初始化程序等等。在每种情况下,我们都使用相同的语法(大括号),但它具有不同的语义。

【讨论】:

  • 如果反对者和删除者愿意发表评论......也许这个答案可以改进...... :)
【解决方案2】:

什么是 Java 中左花括号表示的包罗万象的定义?

没有。我能给你的最接近的东西是模糊的,比如:

  • “某种语言结构序列的开始,以右花括号结束。”

没有给出更精确的single定义的原因是左大括号是几种不同语言结构的一部分,至少包括(也许我错过了一些):

值得注意的是,不是Java 中涉及一些用大括号括起来的东西的每个构造都是一个“块”。上面链接的规范将“块”定义为由大括号括起来的零个或多个BlockStatements 的序列。它进一步将BlockStatement 定义为local variable declarationclass declarationstatement。虽然这个定义涵盖了许多使用大括号的 Java 结构 - 例如,static initializer 是一个块,而 forif 语句的主体,如果包含在大括号中,是一个块 - 它确实 不涵盖类体或数组初始化器,它们与块有不同的内容。

{ 缺乏一个单一的、包罗万象的定义应该不足为奇,或者在任何方面在哲学上都不令人满意。想象以下类似的问题:

什么是英文“of”这个词的包罗万象的定义?

当然,没有这样包罗万象的定义;相反,“of”是many meanings 的一个词。您可以做的最好的事情是要么说“'of' 是介词”,要么像字典一样列举各个含义。

【讨论】:

  • 虽然我不是 100% 同意你的观点,但我们的不同之处更多的是意见而非事实。你的回答比我的更连贯,“某种语言序列的开始......”或多或少符合我想说的(即使我称之为块),所以+1跨度>
【解决方案3】:

你导师的问题似乎不是很好,因为在 Java 中 { 符号没有一个统一的含义。

在语句的上下文中,{ 符号用于表示块语句的开始。这说明了 { with if 语句、while 循环、for 循环、do ... while 循环、switch 语句等的所有用法,它们在技术上仅适用于单个语句,但通常与块语句一起使用:

if (x == 0) {
    statementOne();
    statementTwo();
}

在方法或类型(类/接口/枚举/注解)的上下文中,{ 符号用于表示类或方法主体的开始:

public class NewClass {
    ...

    public void foo() {
         ...
    }
}

它也可以在类中用于声明初始化程序或静态初始化程序块:

class MyClass() {
    static int x;
    static {
        x = somethingHorrible();
    }
};

在数组字面量的上下文中,{ 符号用于表示该字面量中使用的元素列表的开始:

int[] arr = new int[] {1, 3, 7};

开括号符号的这些用法中的每一种都不同于其他所有用法。事实上,如果我们为这些不同的上下文中的每一个使用不同的符号,该语言就可以正常工作。

我认为对您的问题的最佳答案是 { 用于将某些事物视为一个单元的上下文中,无论是块语句(许多语句被视为单个语句),一个类(许多方法和字段被视为单个对象)、方法(许多语句被视为单个统一的代码)、初始化程序(需要一次完成的许多事情)等。

在大多数情况下,正如 cmets 所指出的,大括号引入了一个新的范围。语句块、类体、初始化体和函数体都引入了新的作用域,这绝对是需要牢记的重要内容。 (不过,数组初始化不会这样做。)

【讨论】:

  • 虽然我认为你写了一个很好的答案,但我不同意这个问题“不太好”。年轻程序员的一大障碍是理解scope的含义。在您提供的所有示例中,存在一种相互联系,它是“新范围的开始”。 scope 是您在答案中提到的 context
  • @alfasin 对于大多数示例都是如此,但它不适用于数组字面量初始化。不过,我确实明白你在说什么。
  • @alfasin 其实,我想得越多,我就越同意你的看法。我已经相应地更新了我的答案。
猜你喜欢
  • 2012-09-11
  • 2016-10-01
  • 2019-06-16
  • 2010-12-29
  • 1970-01-01
  • 2014-09-30
  • 2022-06-13
相关资源
最近更新 更多