构造函数中的初始化块

时间:2011-07-08 10:41:23

标签: java constructor initialization

我知道初始化块在构造函数中调用'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之后无论如何都会运行。我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:6)

它不是初始化块,它的简单块

就像

一样
public void foo(){

  {
      //some code
  }
}

目的:

您可以限制范围

答案 1 :(得分:2)

找出答案的最佳方法可能是询问作者的代码。也许他包围了代码块以表明这些初始化的重要性。或许他这样做是因为他想表明localslocalUniverse仅用于初始化emptySet

另一方面,在Java中,您可以执行类似

的操作
public class SomeClass extend ParenClass{
    private int val;   

    {
        //initializztion block
        val = -1;
    }

    public SomeClass()
    {
        super();
    }

    public SomeClass(String iniName)
    {
        super(iniName);
    }   
}

初始化块将在编译期间复制到每个构造函数的开头(超级调用之后)。

因此,作者可能会将代码块复制并粘贴到错误的位置;他将其复制到构造函数中而不是构造函数之外。