个人理解执行逻辑如下:
1,执行static修饰的变量,首先寻找被static修饰的静态变量和静态代码块。
2,执行main()方法。被stiatic修饰的变量执行完毕后,执行main()方法(注:static方法没用调用不会执行),实际上main()也是被static修饰。
3,如果在main()方法中构造新对象,需要在构造对象前要执行完所有的代码块(注:方法没用调用不会执行)。
4,按顺序执行代码块。
5,执行构造方法,构造方法执行完毕,则对象构造完毕,返回main()方法继续往下执行。
public class executeOrder {
{
System.out.println("匿名代码块一号");//5,按照顺序执行代码块,首先输出“匿名代码块一号”
}
static void fun(){
System.out.println("静态方法");//注:即使是静态方法,没有调用也不会加载。调用的时候才加载。
}
static {
System.out.println("静态代码块"); //1,首先寻找被static修饰的静态变量和静态代码块。
}
static String staticstr1 = "静态字符串1";
String str1 = "非静态字符串1";
{
System.out.println(staticstr1);//6,按照顺序执行,输出改代码块的内容。
System.out.println(str1);
System.out.println(staticstr2);
//System.out.println(str2); //此处编译器报错,无法引用str2,因为还未按照顺序加载到这个非静态变量,获取不到引用,但是静态的statictr2可以引用。
System.out.println("匿名代码块二号");
}
String str2 = "非静态字符串2";
static String staticstr2 = "静态字符串2";
/*public void*/ executeOrder(){ //构造方法被void修饰之后就不执行了。留个问号
System.out.println("执行构造方法");//7,执行完所有代码块之后,执行构造方法,对象构造完毕。
}
public static void main(String[] args){ //2,被stiatic修饰的变量执行完毕后,执行main()方法(注:static方法没用调用不会执行),实际上main()也是被static修饰了。
System.out.println("beforeNewObject");//3,按照顺序执行,输出beforeNewObject
new executeOrder();//4,此时在准备构造个新对象,但是构造对象前要执行完所有的代码块。
System.out.println("afterNewObject");//8,对象构造完毕后,继续执行,输出“afterNewObject”
}
}
//预测输出结果:静态代码块,beforeNewObject,匿名代码块一号,静态字符串1
//非静态字符串1,静态字符串2,匿名代码块2号,执行构造方法,afterNewObject
执行结果:
静态代码块
beforeNewObject
匿名代码块一号
静态字符串1
非静态字符串1
静态字符串2
匿名代码块二号
执行构造方法
afterNewObject