在查看我从其他开发人员那里获得的代码时,我遇到了以下代码。
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”?)
答案 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将解释实例块的重要性 首先调用静态实例块,然后调用实例块,最后调用构造函数。静态实例块只调用一次,而每当创建一个新对象时,都会调用实例块和构造函数。