要知道该代码的执行顺序,首先明确:
1.静态代码顺序执行,请牢记!!!
2.静态代码块 -> 构造代码块 -> 构造方法
public class JDtest1 {
public static JDtest1 t1 = new JDtest1(); //静态成员变量
{
System.out.println("blockA"); //构造代码块
}
static{
System.out.println("blockB"); //静态代码块
}
public static void main(String[] args) {
JDtest1 t2 = new JDtest1();
}
}
1.在该代码中,加载类JDtest1时,首先执行的第一行代码,定义静态成员变量 t1,(静态成员是类所有的对象的共享的成员,而不是某个对象的成员。)
2.定义的t1的同时,又new了一个新的对象出来,这个对象是本类对象,new的过程中,首先要执行构造代码块,即输出了“blockA”
3.接着,执行下一行static代码块,输出“blockB”,至此,类加载完成
4.执行main方法,同样,new了一个JDtest1对象,接下来要执行的是构造代码块,输出“blockA”
因此,最终输出:
blockA
blockB
blockA
例题2:
public class StaticVariableTest1 {
private static StaticVariableTest1 obj = new StaticVariableTest1();
private static int counter1;
private static int counter2 = 0;
private StaticVariableTest1(){
counter1++;
counter2++;
}
public static StaticVariableTest1 getInstance(){
return obj;
}
/**
* @param args
*/
public static void main(String[] args) {
StaticVariableTest1 obj = StaticVariableTest1.getInstance();
System.out.println("obj.counter1=="+obj.counter1);
System.out.println("obj.counter2=="+obj.counter2);
}
}
结果:
obj.counter1==1
obj.counter2==0
执行过程详解:
从main函数开始
1 类加载的过程:
1.1 先执行第一句static代码,new对象的时候,调用了构造方法
构造方法执行完毕之后,counter1==1,counter2==2
1.2 接着执行第3句,赋值语句,将counter2赋值为0
2 获取实例过程
通过getInstance的return ,返回一个在静态加载时已经创建的实例
3 打印
打印counter1 --1
打印counter2 --0