2015-06-14 31 views

回答

4

這是一個static塊。它在您的代碼中第一次引用類時執行,並且它調用一個名爲foo()的靜態方法。你可以找到更多關於靜態塊here的信息。正如@CommonsWare提到的,你可以用兩種不同的方式初始化靜態字段,內聯聲明時

static ArrayList<String> test = new ArrayList<String>() {{ 
    add("A"); 
    add("B"); 
    add("C"); 
}}; 

但你可以看到它是不容易閱讀。如果您使用靜態塊,而不是

static ArrayList<String> test; 
    static { 
     test = new ArrayList<>(); 
     test.add("a"); 
     test.add("b"); 
     test.add("c"); 
    } 

或在你的問題有

static ArrayList<String> test; 
static { 
    foo(); 
} 

private static void foo() { 
    test = new ArrayList<>(); 
    test.add("a"); 
    test.add("b"); 
    test.add("c"); 
} 
2

類的靜態成員意味着它可以在不具有可變的實例調用。

例如

class my_class 
{ 
    static void my_static_function() 
    { 
    // whatever 
    } 
} 

你可以把它在兩個方面:

my_class::my_static_function(); 

my_class m; 
m.my_static_function(); 
2

這是一個靜態初始化塊,這是用於初始化靜態變量。這些在一個類的生命中運行一次(不是每次創建實例時)。例如,您可能希望以通常無法完成的方式填充靜態數據結構。

還有非靜態初始化塊。每次創建實例時都會運行它們。它們通常用於初始化匿名類的變量。知道這些在構造函數之前執行是很有用的。

class BlockTest { 
    static { 
     System.out.println("Static block."); 
    } 

    { 
     System.out.println("Non-static block."); 
    } 

    public BlockTest() { 
     System.out.println("Constructor."); 
    } 

    public static void main(String[] args) { 
     new BlockTest(); 
    } 
} 

此代碼將輸出以下內容:

Static block. 
Non-static block. 
Constructor.