ときどき、Android のクラスで次のようなものを目にします。
static
{
foo();
}
これは何をしますか?
なんで?
ときどき、Android のクラスで次のようなものを目にします。
static
{
foo();
}
これは何をしますか?
なんで?
それがstatic
ブロックです。そのクラスがコードで初めて参照されたときに実行され、 という静的メソッドを呼び出していますfoo()
。静的ブロックの詳細については、こちらを参照してください。@CommonsWare で述べたように、2 つの異なる方法で静的フィールドを初期化できます。
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");
}
静的クラス メンバーは、変数のインスタンスがなくても呼び出すことができることを意味します。
例えば
class my_class
{
static void my_static_function()
{
// whatever
}
}
両方の方法で呼び出すことができます。
my_class::my_static_function();
my_class m;
m.my_static_function();
これは、静的変数の初期化に使用される静的初期化ブロックです。これらは、クラスの存続期間中に 1 回実行されます (インスタンスを作成するたびではありません)。たとえば、通常はできない方法で静的データ構造を作成したい場合があります。
非静的初期化ブロックもあります。これらは、インスタンスが作成されるたびに実行されます。これらは、匿名クラスの変数を初期化するためによく使用されます。これらがコンストラクターの前に実行されることを知っておくと便利です。
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.