Java中的花括号只是什么意思?

22
我正在阅读一本书,在其中有几个示例程序只包含花括号。
例如:
 public static void main(String args[]){
     //what is the uses of curly braces here.
     {
          //some code
     }
 }
5个回答

33

这是一个代码块。在其中声明的变量不会在上层块(花括号外部的方法体)中可见,也就是说它们具有更有限的作用域。


2
更为复杂的术语是“块”,请在此处查看:http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html - jmj
请点击这里查看有关“Java花括号”的信息。 - jmj
谢谢提供信息,非常感激。我通常会使用谷歌搜索,但不确定这种问题的搜索词是什么。 - user373201

15

要注意,它并不总是像其他人建议的那样是初始化块。在您的情况下,它是一种称为代码块或块的变量作用域机制。

如果它位于方法外部,那么确实如此!

例如:

public class MyClass {

   {
      // this is an initialisation block
   }

}

然而,如果它在一个方法内部,那么就不是!在这种情况下(也是您示例中的情况),它是一个代码块。花括号内初始化的任何内容都无法在外部看到。

例子:

public static void main(String args[]){

     {
          String myString = "you can't see me!";
     }
     System.out.println(myString); // this will not compile because myString is not visible.
 }

如果它在一个方法内部。例如在 OP 的示例中。 - Goran Jovic
@goran,我在为用户澄清问题,因为很多现在已被删除的答案都声称这是一个初始化块。因此,我觉得值得澄清花括号的两种用法。 - Codemwnci
@the,@goran - 他在他的回答中说过。我以前从未见过这两种情况,所以我认为解释它在不同的上下文中有不同的作用是一个好主意。 - Brad Mace
哦,明白了。我只是评论了一下,因为你开始解释它不是什么。现在其他答案都被删除了,有点脱离语境了。 - Goran Jovic

4
这种将大括号作为编码结构的想法,在Java世界中引起了争议。当人们看到孤立的大括号时,会有几种解释。因此,我将试图从实际的角度回答你的问题。
你在这里发帖所隐含的问题实际上是:什么时候/为什么要使用这些大括号?从实际的角度来说,下面的情况可能会导致孤立的代码块:
1)程序员希望通过添加作用域,以便于重复使用变量名而不必担心名称冲突,以增加代码的清晰度(例如,在单元测试或数据库插入块中创建多个相同类型的对象)。
其他可能的原因包括:
2)忘记开发中的 if/else/for/while 循环代码。
3)剩余的 if/else/for/while 语句的遗留物。
4)自动生成的代码使用作用域来简化创建具有相同变量名称的多个类似组件的过程(例如,考虑一个需要为100个单选按钮生成代码的 GUI 生成器——它可以使用作用域而不是逐个递增变量名称)。
5)作为微小、可重用、可粘贴的逻辑块,其副作用最小:程序员感觉一个方法中的代码块太难懂了,其变量和内部副作用应该对外界具有最小的可见性。也就是说,程序员使用代码块作为一种贫民版的匿名 lambda 函数(尽管没有返回值)。在这种模式下,可能会做类似下面的事情:
//lets say I want to make a primary key for a dogs name in a database. 
String dogNameKey=null;
{
    long time = System.currentTimeInMilliseconds();
    String theName = "spot";
    dogName=theName+"_"+time;
}

显然,对于命名这个记录(dogNameKey),简单的策略并不值得外部方法使用 - 太过简单了。但与此同时,“time”变量在创造这个名称的逻辑之外或者对于这个小键生成模块所包含的方法没有任何影响或可访问性 - 也就是说,它甚至对于包含该模块的方法都不相关。因此,通过使用大括号,我定义了其作用域。如果可以使用lambda,则所有这些作用域都可以包含在一个匿名函数中。现在 - 我可以粘贴多个这样的块,并且变量名称将是相同的,因此可以轻松通过肉眼扫描它们。
因此,当您只看到单独的花括号时,它们通常非常重要 - 它们实现了特定的自定义作用域,或者是错误的产物,或者是自动生成的代码的产物。作用域还可以用于“开始”重构方法而不实际编写新方法,通过分离其独立部分...... 尽管IDE比人类更擅长这种操作。

2

它被称为

块是由大括号内的语句序列、局部类声明和局部变量声明语句组成。

另请参阅:


2

在某些情况下,您可以通过这种方式逻辑地分离代码,事实上,我经常应用一种用例:演示数据。例如,您有一个生成演示数据条目并将其插入数据库的演示数据生成类。您可以将每个单独的项目放在这样的块中,并且可以进行复制粘贴而不更改变量名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接