个人理解执行逻辑如下:
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