2011-07-08 284 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); 
    } 
} 

初始化塊將得到複製到每一個建設者的開始(後超級調用)。

所以也許作者複製粘貼代碼塊到錯誤的地方;他將其複製到構造函數中,而不是在構造函數之外。