类加载的顺序问题,static属性在前还是static方法在前

class Insect{
    private int i = 9;
    protected int j;
    Insect(){
        j = 39;
    }
    private static int x1 = printInit("static Insect.x1 initialized");
    static int printInit(String s){
        System.out.println(s);
        return 47;
    }
}

类加载的顺序应该是1、static属性;2、static方法。
那么应该是private static int x1先执行,然后执行static int printInit方法。
但是属性定义时需要调用printInit方法,这是怎么调用的?

public class Study23 {
    private static int x1 = printInit("static Insect.x1 initialized");
    static int printInit(String s){
        //输出 Test Message
        System.out.println(msg);
        System.out.println(s);
        return 47;
    }
    static  String msg = "Test Message";
}

可以看到static变量 msg 定义在 printInit方法之后,但是我们却在之前引用了它,而且代码并没有报错。其实static类型的变量以及方法是程序运行期间一直存在的,是类级别的变量。所以static变量及方法间引用是不区分先后顺序的。jvm译时会将static变量以及方法放在公共区域,属于平行关系。

可以看看我写的static文章

有关static的用法总结详解:https://blog.csdn.net/u012011079/article/details/115799789
(欢迎各位大佬斧正,里面包含了设计过程的static、面向对象的static、类模板含有static的解析)