2011-07-08 226 views
2

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

回答

6

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

就像

public void foo(){ 

    { 
     //some code 
    } 
} 

目的:

您可以有限制范围

+1

那么“简单块”的目的是什么?为什么要使用它? – Joeblackdev

+3

你可以有范围的优势..你可以在这个块做一些本地的东西。 –

+1

好的,为了确保你定义的任何东西都不能在块之外访问?这就是为什么你会使用它们吗? – Joeblackdev

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); 
    } 
} 

初始化块将得到复制到每一个建设者的开始(后超级调用)。

所以也许作者复制粘贴代码块到错误的地方;他将其复制到构造函数中,而不是在构造函数之外。