public class SingleTest {
public static void main(String[] args) {
Single instance = Single.getInstance();
}
}
class Zi33{
static{
System.out.println("zi static block init");
}
public Zi33(){
System.out.println("zi init method run");
}
}
class Single extends Zi33{
static{
System.out.println("static block 1 run");
}
private static Single instance = new Single();
static{
System.out.println("static block init");
}
private int age = 2;
private String name ="kkk";
private Single(){
System.out.println("init method run");
System.out.println(age+name);
}
public static Single getInstance(){
return instance;
}
public static void main(String[] args) {
Single instance = Single.getInstance();
}
}
class Zi33{
static{
System.out.println("zi static block init");
}
public Zi33(){
System.out.println("zi init method run");
}
}
class Single extends Zi33{
static{
System.out.println("static block 1 run");
}
private static Single instance = new Single();
static{
System.out.println("static block init");
}
private int age = 2;
private String name ="kkk";
private Single(){
System.out.println("init method run");
System.out.println(age+name);
}
public static Single getInstance(){
return instance;
}
}
执行结果:
zi static block init
static block 1 run
zi init method run
init method run
2kkk
static block init
分析:当第一次调用getInstance()方法时Single类未加载到内存中,它会先加载其父类就有了第一句
加载为父类接着加载自己它会搜集静态属性显示初始化和静态代码块。其执行顺序和其出现顺序相同。
所有第二句出现类。由于第三句为new Single()又因为类已经加载所有执行它里面的语句(同时我们可以看出构造方法是不是一个隐式的static方法了)。接着执行下一个静态代码块