0

有时我会在 Android 的一个类中看到类似的东西:

static
{
    foo();
}
  • 这是做什么的?

  • 为什么?

4

3 回答 3

4

那是一个static块。它在您的代码中第一次引用该类时执行,它正在调用一个名为foo(). 您可以在此处找到有关静态块的更多信息。正如@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");
}
于 2015-06-14T15:01:48.420 回答
2

静态类成员意味着可以在没有变量实例的情况下调用它。

例如

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

您可以通过以下两种方式调用它:

my_class::my_static_function();

my_class m;
m.my_static_function();
于 2015-06-14T15:02:19.857 回答
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.
于 2015-06-14T15:13:10.490 回答