我刚刚遇到以下情况。
if ( test ) {
{
// statements 1
}
{
// statements 2
}
}
这是我第一次看到这个。它是如何工作的?
答案 0 :(得分:53)
只是编写两个不同的代码块来隐藏局部变量。
从问题“Anonymous code blocks in Java”的回答:
阻止限制变量范围。
public void foo() { { int i = 10; } System.out.println(i); // Won't compile. }
但实际上,如果您发现自己使用了这样的代码块 这可能是你想要将那个块重构为a的一个标志 方法
答案 1 :(得分:21)
这可以(稍微)有用的两个例子 - 在单元测试和GUI中,这两个例子通常都涉及重复的代码:
它在GUI构建中非常有用,它可以非常容易地剪切和粘贴与一个组件相关的行,并且忘记为新组件更新它们,从而导致难以发现的错误,例如:
JButton button1 = new JButton("OK");
button1.setEnabled(false);
button1.setAlignmentX(-1);
JButton button2 = new JButton("Apply");
button1.setEnabled(false);
button1.setAlignmentX(-1);
糟糕,我刚刚配置了button1
两次。如果将每个按钮放在它自己的块中,则编译器会选择此错误。同样,你可以在一个单独的方法中创建每个按钮,但这可能使得很难看到发生了什么(特别是考虑到Java中缺少关键字参数):
JButton button_ok = makeButton("OK", false, -1);
JButton button_apply = makeButton("Apply", true, 1);
// what exactly is being set here?
...
// much later:
private static JButton makeButton(String name, boolean enabled,
int alignment)
{
JButton button = new JButton(name);
button.setEnabled(enabled);
button.setAlignmentX(alignment);
return button;
}
...你可能会得到许多方法,每种方法都处理不同的参数变化,每种方法只能使用两次。
答案 2 :(得分:10)
这两个街区是独立的。因此,您在第一个块中可能具有的任何变量将无法在第二个块中访问 - 或者在第一个块之外的任何位置。它被称为代码隔离或范围。
答案 3 :(得分:7)
{}
引入了范围,并且范围内声明的变量仅存在于该范围内。例如:
if ( test ) {
int i = 0;
float i = 0;
}
将无法编译,因为i
已在同一范围内声明了两次。
if ( test ) {
{
int i = 0;
}
{
float i = 0;
}
}
编译正常,因为i
尚未在同一范围内声明两次。
答案 4 :(得分:6)
无。他们声明了代码块。通常你不会使用它们。唯一的区别是如果你在第一个中声明一个变量 - 它将无法在第二个变量中访问。
答案 5 :(得分:4)
顺序执行这两个块。每个块定义局部变量的新范围。你可以拥有
int i;
两个街区。
答案 6 :(得分:4)
这些是匿名块。它们用于限制范围。不仅在Java中,还有其他语言,如C#和C。