我知道初始化块在构造函数中调用'super()'后运行。但是,今天早上查看一些代码时,我发现了以下内容:
public class SimpleListLocalsAnalysis extends BackwardFlowAnalysis
FlowSet emptySet;
public SimpleLiveLocalsAnalysis(UnitGraph graph) {
super(graph);
{
Chain locals = g.getBody().getLocals();
FlowUniverse localUniverse = new FlowUniverse(locals.toArray());
emptySet = new ArrayPackedSet(localUniverse);
}
doAnalysis();
}
...
}
上面的代码显示了在'super(graph)'调用之后的初始化块中进行的一些初始化。将代码放在构造函数中的初始化块中的目的是什么,因为它在调用super之后无论如何都会运行。我在这里错过了什么吗?
答案 0 :(得分:6)
它不是初始化块,它的简单块
就像
一样public void foo(){
{
//some code
}
}
目的:
您可以限制范围
答案 1 :(得分:2)
找出答案的最佳方法可能是询问作者的代码。也许他包围了代码块以表明这些初始化的重要性。或许他这样做是因为他想表明locals
和localUniverse
仅用于初始化emptySet
。
另一方面,在Java中,您可以执行类似
的操作public class SomeClass extend ParenClass{
private int val;
{
//initializztion block
val = -1;
}
public SomeClass()
{
super();
}
public SomeClass(String iniName)
{
super(iniName);
}
}
初始化块将在编译期间复制到每个构造函数的开头(超级调用之后)。
因此,作者可能会将代码块复制并粘贴到错误的位置;他将其复制到构造函数中而不是构造函数之外。