目录
执行顺序:
-
父类静态代码块(static) ->
-
子类静态代码块(static) ->
-
父类非静态代码块 ->
-
父类构造函数 ->
-
子类非静态代码块 ->
-
子类构造函数
tips:
- 执行遵循static优先原则
- 静态代码块在类加载时执行,类加载在编译阶段(生成.class文件)完成,即只一次运行只执行一次
- 当new对象的时候,从上至下执行一次非静态初始化语句和初始化块
- 构造函数在创建对象时执行
一个简单Demo
package explore.testEntity;
public class testClass {
private String phone = a();
private static String phone1 = a();
static {
System.out.println("static执行");
}
public static String a(){
System.out.println("调用static方法a");
return "调用static方法a";
}
public testClass(){
System.out.println("构造函数");
}
{
System.out.println("非静态内容");
}
public static void main(String[] args) {
testClass tc = new testClass();
}
}
复杂Demo
package explore.testEntity;
public class testClass {
private static int k = 1;
private static testClass t1 = new testClass("t1");
private static testClass t2 = new testClass("t2");
private static int i = print("i");
private static int n = 99;
{
print("初始化块");
}
public testClass(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
static {
print("静态块");
n = 100;
}
private int j = print("j");
public static int print(String str) {
System.out.println((k++) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String[] args) {
testClass tc = new testClass("explore.testClass.test");
}
}
顺序解析:
- 首先执行main函数,创建一个新对象
- 第一次创建该类的对象,进行类的编译
- 首先从上至下执行静态部分
- k=1
- 执行创建t1对象
- 当一个内部创建一个他自身的对象的时候,不执行静态部分
- 从上至下执行非静态部分
- 非静态代码块,调用print方法
- k为1,str为参数“初始化块”,i,j未赋值,为0(Integer包装类型未赋值才为null),i、n自增,return i
- 执行int j赋值
- 调用print方法
- 非静态方法执行完毕,执行构造函数public testClass(String str){...省略...}
- 构造函数执行完毕,t1对象创建完成
- 执行创建t2对象
- 创建过程同t1,只是i,k值始终在该类内部使用,数据一直在迭代
- 为i赋值
- 调用print方法
- 为n赋值
- 执行静态代码块
- 调用print方法
- n=100
- 静态部分执行完毕,从上至下执行非静态部分
- 非静态代码块
- 调用print方法
- 为j赋值
- 调用print方法
- 非静态部分执行完毕,执行构造函数
- main方法中的创建对象执行完毕