public class Example {
// 静态变量
public static int staticVar = 1;
// 实例变量
public int instanceVar = 2;
// 静态初始化块
static {
System.out.println("执行静态初始化块");
staticVar = 3;
}
// 实例初始化块
{
System.out.println("执行实例初始化块");
instanceVar = 4;
}
// 构造方法
public Example() {
System.out.println("执行构造方法");
}
public static void main(String[] args) {
System.out.println("执行main方法");
Example e1 = new Example();
Example e2 = new Example();
System.out.println("e1的静态变量:" + e1.staticVar);
System.out.println("e1的实例变量:" + e1.instanceVar);
System.out.println("e2的静态变量:" + e2.staticVar);
System.out.println("e2的实例变量:" + e2.instanceVar);
}
}
执行结果
执行静态初始化块
执行main方法
执行实例初始化块
执行构造方法
执行实例初始化块
执行构造方法
e1的静态变量:3
e1的实例变量:4
e2的静态变量:3
e2的实例变量:4
从输出结果可以看出,静态初始化块在类加载时执行,只会执行一次,并且优先于实例初始化块和构造方法的执行;实例初始化块在每次创建对象时执行,在构造方法之前执行
首先加在父类 Sup 静态变量 a =1,然后执行代码块b = 3, 然后 b =2(其实静态变量和静态代码块那个在前面就执行哪个),然后执行子类的静态变量 a = 11,b =22 ,然后加载 Test测试类new
Sub a =6 ,b =9 然后加载到子类 ,执行super(a,b)到父类 执行父类中打印 a和b 1,2 ,执行this.a 把6,9接受,打印a,b 就是 6,9 执行完,返回子类执行 打印,此时 a= 11,b =22
这时子类父类全部加载完成。返回测试类 执行 sub的打印 a,b 11 ,22 执行 sup的打印 6,9
首先到父类加载静态变量a = 1,静态代码块b = 3,然后执行静态变量b =2,然后到测试类 new Sub a=6,b=9 这会到sub中,加载Sbu的构造 a =6,b =9 ,执行下一条语句super(a,b)
打印,a,b 为 0,0 因为这会Sub中 int a =11,b =22,然后打印加载出来的a =1,b =2.
往后执行到this.a = a 这会a =6,b =7 传给this 执行打印 还没有加载所以 sub 的a,b还是0,0
super.a和b 这会是6,9 。
这会执行加载 int a = 11, b =22 ,然后执行Sub构造 中的打印 , 这会 super a =6 b =9,this 的 a=11,b =22.
作业题
11
0
11
0
11
32