Java语法 - 它做什么?

时间:2013-02-21 12:12:32

标签: java syntax

在查看我从其他开发人员那里获得的代码时,我遇到了以下代码。

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 docs中的“syntax-magic”?)

5 个答案:

答案 0 :(得分:3)

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

,这个blog有一个很好的解释

答案 1 :(得分: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,这将无效,因为匿名类无法继承最终类{{1}}。

答案 2 :(得分: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的新类。下一个{表示匿名块,只是对您的代码进行分组。编辑:由于它在函数外部,因此在创建对象时将调用它。

答案 3 :(得分:1)

此代码创建ArrayList的匿名子类的实例(第一对{})。这是相对的问题:How are Anonymous (inner) classes used in Java?

嵌套块是实例初始化块(请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html)。这意味着在创建实例时,将在执行构造函数(任何构造函数)之前执行此代码。

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

答案 4 :(得分: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将解释实例块的重要性 首先调用静态实例块,然后调用实例块,最后调用构造函数。静态实例块只调用一次,而每当创建一个新对象时,都会调用实例块和构造函数。