关于静态的初始化题
public class StaticDemo {
public static void main(String[] args) {
Demo1 d = Demo1.getInstance();
System.out.println(d.count1+"......."+d.count2);
}
}
class Demo1{
private Demo1(){
System.out.println(count1+"...构造函数前..."+count2);
count1++;
count2++;
System.out.println(count1+"...构造函数后..."+count2);
}
public static int count1;
public static int count2=2;
static{
System.out.println(count1+"...静态代码块前..."+count2);
count1++;
count2++;
System.out.println(count1+"...静态代码块后..."+count2);
}
private static Demo1 d = new Demo1();
public static Demo1 getInstance(){
return d;
}
}
一个类中包含静态成员变量,静态代码块等,会在类加载时,根据这些静态变量和代码的在源码中的顺序执行.
本题中就是这样的,类加载时,1,先执行两成员变量的默认和显示初始化.2,执行静态代码块,在执行静态类对象的
创建,此时调用构造函数进行初始化.
所以结果是:
0...静态代码块前...2
1...静态代码块后...3
1...构造函数前...3
2...构造函数后...4
2.......4
若把对象的创建放在成员变量初始化之前,结果就有不一样.1,先是默认初始化,再执行构造代码块,2然后才是显示初始化.
3,最后才是静态代码块.
执行结果:
0...构造函数前...0
1...构造函数后...1
1...静态代码块前...2
2...静态代码块后...3
2.......3
|