要精确搜索这个很难。我已经在一些地方看过这个,我甚至在代码中尝试过它,看看它是如何工作的,但这样我才知道它们是如何被使用的,并确保我不会滥用它们我想我会问在这里。
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...
}
.
.
.
}
}
提前致谢
答案 0 :(得分:1)
大括号定义范围。例如,如果您在大括号内定义一个局部变量并为其赋值,如下所示:
{
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
}
在这种情况下,我在更大的范围空间(封闭方法或构造函数)中定义,而for循环只是递增其值。所以你在两个不同的范围区域内共享一个变量。
最后,您可以在方法或构造函数之外将它们用作类中的初始化块。它们允许您初始化成员变量,例如,无法使用单行代码轻松初始化。
答案 1 :(得分:1)
在类中,它们形成一个静态初始化程序,它在加载类时运行一次,这首先发生。
在方法中,它们标记范围。它们在您的代码中基本没用。
但如果代码如下
{
String str = "test";
System.out.println(str);
}
{
System.out.println(str);
}
第二个打印将报告编译错误,因为str的范围在第一个范围内。
答案 2 :(得分:0)
所以找到了我认为我会在这里发布给任何人的东西,因为其他问题似乎都没有明确说明这一点。
在类范围内的方法之外使用时:
public class doSomethingSPecial() {
{
System.out.println("This is a constructor");
}
public doSomeThingSpecial() {}
public doSomethingSpecial(String specialString) { }
public doSomethingSpecial(int specialNumber) { }
}
“Java编译器将初始化程序块复制到每个构造函数中。因此,这种方法可用于在多个构造函数之间共享代码块。” - {{3 (感谢Soririous Delimanolis)
因此,每次调用构造函数时都会调用内联大括号。
关于在方法和循环中使用的其他问题,大括号似乎只是为了限制范围。
“但实际上,如果你发现自己使用这样的代码块,这可能表明你想要将该块重构为方法” - 感谢Robert Munteanu {{3} }
这基本上是我到目前为止所提出的所有内容