/**
* @author chris
* @date 2018/10/30 - 15:24
* 类加载执行顺序:
* 1.静态属性,静态方法声明,静态块。
*
* 2.动态属性,普通方法声明,构造块。
*
* 3.构造方法。
*
* 当new一个对象时,此时会调用构造方法,但是在调用构造方法之前,(除非被打断而暂停)执行动态属性定义并设置默认值(一举生成的)。
*/
public class Text {
//类加载jvm先对属性赋默认值 根据数据类型
public static int k = 0; // 1.静态属性
public static Text t1 = new Text("t1"); //2.静态属性 new对象暂停了类加载过程去执行构造方法,但在之前先执行动态属性定义并设置默认值 ,
// 然后动态属性初始化,分配内存,构造块,普通方法声明(只是加载,它不需要初始化,只有调用它时才分配内存,
// 当方法执行完毕后内存立即释放),没有优先级之分,按出现顺序执行。
public static Text t2 = new Text("t2"); //重复上述操作
public static int i = print("i"); //静态属性
public static int n = 99; //静态属性 至此静态方法执行完毕 开始执行静态块
public int j = print("j");
{
print("构造块");//构造块
}
static {
print("静态块");//静态块 静态块执行完之后 执行main方法 (main方法也属于特殊静态方法)
}
public Text(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++i;
++n;
}
public static int print(String str) {
System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
++n;
return ++i;
}
public static void main(String args[]) {
Text t = new Text("init");//main方法开始之后 开始执行动态属性 及代码块
}
}
Text类加载执行是 最先jvm给属性默认值(按数据类型) 加载静态属性 其中 第二个静态属性被实例化过程打断 转而在执行构造方法之前加载了动态属性和构造块 静态属性加载完成之后加载静态块 然后找到了静态main方法 开始实例化 重复了之前两个静态属性后的操作