“外部”括号表示您要创建一个匿名子类,第二个括号是对象初始化器。 初始化程序在类的构造函数之前运行,但在任何super调用之后运行(因此也在所有超类初始化程序之后)。 您也可以在非匿名类中使用初始化程序,如果您有多个不能互相调用的构造函数,或者需要比通常的字段初始化程序更复杂的初始化的字段,则这是一种便捷的方式来初始化final字段。
考虑此类:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
public X(A a) throws SomeException {
super(a);
lulz = someCondition()? danger() : 0;
}
public X(B b) throws SomeException {
super(b);
lulz = someCondition()? danger() : 0;
}
}
可以将其重写为:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
{ // initalizer -- might throw SomeException!
lulz = someCondition()? danger() : 0;
}
public X(A a) throws SomeException { super(a); }
public X(B b) throws SomeException { super(b); }
}
如果初始化程序可以引发检查异常,则所有构造函数都必须声明它们可以引发异常。