4

很难准确地搜索到这个。我在几个地方看到过这个,我什至在代码中尝试过,看看它是如何工作的,但只是为了让我确切地知道如何使用它们,并确保我不会滥用它们,我想我会问在这。

 public void doSomethingSpecial()
 {

      String strHello = null;

      // What is the following section in braces for
      {
           strHello = "Hello World"
      }

      for(int i = 0; i < 10; i++)
      {

           //  What is the significance of them it in a loop?
           {
                strHello = "Hello";
                // Do something else...
           }
           .
           .
           .
      }
 }
  • 有人可以澄清这些大括号大括号的用途吗?
  • 我假设它们像一种方法一样工作,并且只要没有在块之外指定任何内容,它们就会限制其范围,但是还有其他用途吗?
  • 他们的确切名字是什么?

提前致谢

4

3 回答 3

2

大括号定义范围。例如,如果您在大括号内定义一个局部变量并为其赋值,如下所示:

{
int foo = 10;

}

然后 foo 的范围(即定义它并具有值的代码部分)被限制在大括号内的区域。

你的 for 循环也是如此。在这些大括号内,计数器 i 被定义并具有意义,但不在外面。所以这段代码不会编译:

for (int i = 0; i < 5; i++) {
  // Do something with i
}

i = 10; // Won't compile. i is undefined as a variable.

这样做的好处很多,因为您可以精确控制不同变量的范围。您还可以在异常处理的上下文中定义异常的范围等。

您还可以执行以下操作:

int i = 0;

for (; i < 5; i++) {
  // Do something with i.
}

for (; i < 10; i++) {
  // Do something else with i
}

在这种情况下, i 被定义在更大的范围空间(封闭方法或构造函数的空间)中,for 循环只是增加它的值。因此,您在两个不同的范围区域之间共享一个变量。

最后,您可以在方法或构造函数之外将它们用作类中的初始化块。它们允许您初始化成员变量,例如,无法用一行代码轻松初始化的成员变量。

于 2013-04-24T14:53:03.110 回答
1

在类中,它们形成一个静态初始化器,它在类加载时运行一次,首先发生。

在该方法中,它们标记了一个范围。它们在您的代码中基本上没用。

但是如果代码如下

  {
      String str = "test";
      System.out.println(str);
  }

  {
      System.out.println(str);
  }

第二次打印会报编译错误,因为str的作用域在第一个作用域。

于 2013-04-24T15:08:36.720 回答
0

所以找到了一些我认为我会在这里为任何人发布的东西,因为其他问题似乎都没有完全澄清这一点。

在类范围内的方法之外使用时:

 public class doSomethingSPecial() {
      {
           System.out.println("This is a constructor");
      }

      public doSomeThingSpecial() {}

      public doSomethingSpecial(String specialString) { }

      public doSomethingSpecial(int specialNumber) { }
 }

“Java 编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。 - Java API 教程(感谢 Soririous Delimanolis)

所以每次调用构造函数时都会调用内联大括号。

至于关于在方法和循环中使用的其他问题,大括号似乎只是为了限制范围。

“但在实践中,如果你发现自己使用这样的代码块,这可能表明你想将该块重构为一个方法” - 归功于 Robert Munteanu最佳答案:Java 中的匿名代码块

到目前为止,这基本上就是我想出的所有东西

于 2013-04-24T15:04:24.477 回答