题目
下列两个程序打印出的a、b值分别是多少?
- 程序1
class Blog {
private static int a;
private static int b = 0;
private static Blog blog = new Blog();
private Blog() {
a++;
b++;
}
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
}
}
- 程序2
class Blog1 {
private static Blog1 blog = new Blog1();
private static int a;
private static int b = 0;
private Blog1() {
a++;
b++;
}
public static void main(String[] args) {
System.out.println(a);
System.out.println(b);
}
}
类加载原理分析
- 在准备阶段,会给所有静态变量赋上初始值,例如int类型初始值为0,对象类型初始值为null;
- 在初始化阶段,所有静态变量,静态代码块按照它们在源代码中出现的先后顺序,依次执行赋值语句;
- 在静态变量被定义之前,可以先对其执行赋值操作,但是不能对其执行读取操作;
题目解析
- Blog类在准备阶段,会给变量a、b赋值0,给blog赋值null。在初始化阶段,会按照静态变量赋值语句的先后顺序,依次执行;
- 程序1中,先执行语句b=0,执行结束a=0,b=0。 再执行语句blog = new Blog(),调用了构造方法,执行两条语句a++,b++,执行结束a=1,b=1。最终程序1打印结果为a=1,b=1;
- 程序2中,先执行语句blog = new Blog(),调用了构造方法,执行两条语句a++,b++,执行结束a=1,b=1。再执行语句b=0,执行结束a=1,b=0。最终程序2打印结果为a=1,b=0;