2015-06-14 106 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.