2013-02-21 93 views
4

在查看我从另一位开发人员那里获得的代码时,我遇到了以下代码片段。Java语法 - 它有什么作用?

public void myMethod() 
{ 
    final MyClass data1 = new MyClass(1,2,3); 
    final MyClass data2 = new MyClass(4,5,6); 
    // [...] 
    final MyClass dataN = new MyClass(M,O,P); 

    ArrayList<MyClass> list = new ArrayList<MyClass>() 
    { 
     { 
      add(data1); 
      add(data2); 
      // [...] 
      add(dataN); 
     } 
    }; 
} 

其实,我想我知道这个代码(填充list与定义的数据)的东西,但还没有我吃惊的结果是如何实现的。 特别我想知道在这种情况下花括号{}的含义。

我知道(想想?),这段代码很糟糕,我已经重写了它,但仅仅是为了好奇 我想知道它到底是什么。

我的猜测是:

  • 首先对{}是一个匿名对象的创建 - 这是转换为ArrayList<MyClass>
  • 第二对{}是 - 我在想 - 类似于静态初始化,但是对于一个对象。 这可能是某种匿名构造函数?

有人能给我一些见解吗? (我在哪里可以找到在Java文档,例如“语法魔法”?)

+0

没错。从原始源复制/粘贴/编辑错误:)谢谢指出。 – GeneSys 2013-02-21 12:29:46

+0

'{}'是大括号或花括号,而不是括号'()'https://en.wikipedia.org/wiki/Bracket – 2013-02-21 16:10:26

+0

@SteveKuo谢谢澄清。作为一名德国母语的人,我不知道这一点,因为在德国,一切都是“klammer” - 很高兴看到英文更明显:) – GeneSys 2013-02-21 19:38:41

回答

3

通过第一个paranthesis,您正在创建一个超类ArrayList的annonymous inner子类。第二个括号是例如初始化您的匿名内部类的实例。有关详细信息,请参阅Doc。有这blog有关实例初始化块

1

此代码将无法正常工作有一个括号缺失(或分号,但这样会导致完全不同的东西。)

final MyClass data1 = new MyClass(1,2,3); 
final MyClass data2 = new MyClass(4,5,6); 
// [...] 
final MyClass dataN = new MyClass(M,O,P); 

ArrayList<MyClass> list = new ArrayList<MyClass>()//here 
{ 
    { 
     add(data1); 
     add(data2); 
     // [...] 
     add(dataN); 
    } 
}; 

而第一个{表示您创建一个扩展ArrayList的新类。下一个{意味着一个匿名块,简单地分组你的代码。编辑:由于这是一个函数外,它将被称为创建对象时。

+0

Woops。你是对的,在原始代码中括号就在那里。抱歉。编辑问题。 – GeneSys 2013-02-21 12:20:45

+2

这是为什么起床投票?它不回答这个问题。他们要求提供有关语法的文档。 – 2013-02-21 12:22:19

+0

@Ash Burlaczenko:你现在确实回答了,至少部分。 – 2013-02-21 13:06:55

2
ArrayList<MyClass> list = new ArrayList<MyClass>{  //anonymous of subclass 
    {  //non-static initializer block 
     System.out.prinln("..."); 
    } 
}; 

首先{}new ArrayList<MyClass>之后创建一个新的匿名子类ArrayList的,因为ArrayList是不是最终的类,你可以做一个很好的解释。

第二对{}是新子类中的非静态块或实例块。


如果您尝试Integer int1 = new Integer(10){};这是行不通的,因为匿名类不能继承的最后一类Integer

0
{ 
     { 
      add(data1); 
      add(data2); 
      // [...] 
      add(dataN); 
     } 
}; 

这是实例块,因此创建该ArrayList(列表)的对象后,该代码段将被执行。在每行的add()方法将被调用和数据将被插入到该ArrayList
这等同于说

ArrayList<MyClass> list = new ArrayList<MyClass>(); 
list.add(data1); 
list.add(data2); 
// [...] 
list.add(dataN); 

正如其他人提及的,doc将解释实例块的重要性。
首先调用静态实例块,然后调用实例块,最后调用构造函数。静态实例块只被调用一次,而实例块和构造函数在创建新对象时被调用。

相关问题