转自http://tieba.baidu.com/p/3643143485
public class TestStaticCon {
public static int a = 0;
static {
a = 10;
System.out.println("静态代码块在执行a=" + a);
}
{
a = 8;
System.out.println("非静态代码块在执行a=" + a);
}
public TestStaticCon() {
this("带参构造方法在执行a=" + a); // 调用另外一个构造方法
System.out.println("无参构造方法在执行a=" + a);
}
public TestStaticCon(String n) {
System.out.println(n);
}
public static void main(String[] args) {
TestStaticCon tsc = null;
System.out.println("!!!!!!!!!!!!!!!!!!!!!");
tsc = new TestStaticCon();
}
}
执行结果:
静态代码块在执行a=10
!!!!!!!!!!!!!!!!!!!!!
非静态代码块在执行a=8
带参构造方法在执行a=10
无参构造方法在执行a=8
网上的一个解释:
声明时就执行静态初始化块。
每个构造函数,如果第一句没写调用其他构造函数,
实际上隐藏了一个调用 super(),然后是 非静态域初始化,
接着才是构造函数里面的其他代码。
如果写了调用其他构造函数,则是先调用写了的构造函数,再非静态域初始化,
然后接着其他的代码。