静态块是按顺序执行的吗?如果它不是一个块也是怎么回事

问题描述 投票:-1回答:1

具有静态初始化器的这些行是否保证按顺序运行?因为如果没有,那么事情可能会出错

public Class x {
    private static final BasicDataSource ds = new BasicDataSource();
    private static final JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
    private static final SomeDao someDao = new SomeDao(jdbcTemplate);
}

好的......这个怎么样?

public Class x {
    private static final BasicDataSource ds;
    private static final JdbcTemplate jdbcTemplate;
    private static final SomeDao someDao;

    static {
        ds = new BasicDataSource();
        ds.setStuff("foo");
        ds.setAnotherProperty("bar");
        jdbcTemplate = new JdbcTemplate(ds);
        SomeDao someDao = new SomeDao(jdbcTemplate);
    }
}
java multithreading concurrency static safe-publication
1个回答
1
投票

它们将按照与源代码中列出的顺序相对应的顺序执行。

一个类可以有任意数量的静态初始化块,它们可以出现在类体中的任何位置。运行时系统保证按照它们在源代码中出现的顺序调用静态初始化块。 Initializing Fields

可以使用以下代码观察到这一点:

private static A a1 = new A(0);
private static A a2 = new A(1);
private static A a3 = new A(2);
private static A a4 = new A(3);
private static A a5 = new A(4);
private static A a6 = new A(5);

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

static class A {
    public A (int a) {
        System.out.print(a);
    }
}

输出总是012345

© www.soinside.com 2019 - 2024. All rights reserved.