Java 安卓:我不明白:静态{foo();}

Java 安卓:我不明白:静态{foo();},java,android,static,static-block,Java,Android,Static,Static Block,有时我会在Android的课堂上看到类似的东西: static { foo(); } 这有什么用 为什么? 那是一个静态块。它在第一次在代码中引用该类时执行,并调用名为foo的静态方法。您可以找到有关静态块的更多信息。正如@commonware所提到的,您可以用两种不同的方式初始化静态字段,即内联声明时间 static ArrayList<String> test = new ArrayList<String>() {{ add("A"); ad

有时我会在Android的课堂上看到类似的东西:

static
{
    foo();
}
这有什么用

为什么?

那是一个静态块。它在第一次在代码中引用该类时执行,并调用名为foo的静态方法。您可以找到有关静态块的更多信息。正如@commonware所提到的,您可以用两种不同的方式初始化静态字段,即内联声明时间

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

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

e、 g

您可以用两种方式来称呼它:

my_class::my_static_function();

my_class m;
m.my_static_function();
它是一个静态初始化程序块,用于初始化静态变量。在类的生命周期中,它们只运行一次,而不是每次创建实例时。例如,您可能希望以通常无法完成的方式填充静态数据结构

还有非静态初始值设定项块。每次创建实例时都会运行这些操作。它们通常用于初始化匿名类的变量。知道这些在构造函数之前执行是很有用的

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.
Static block.
Non-static block.
Constructor.