类的加载过程:

1.先加载类级别的成员(静态成员变量的方法 以及 静态初始化块,这两个打印的顺序依据出现的先后顺序)
2.再加载对象级别的成员(实例初始化块、普通成员变量的方法,打印的顺序依据出现的先后顺序)
3.构造函数

具体例子:
public class ObjectInitTest {
    public ObjectInitTest() {
        System.out.println("这是构造函数alta+Insert快捷键:ObjectInitTest()");
    }
    //静态初始化块
    static{
        b=10;
        System.out.println("静态初始化块");
    }
    //实例初始化块  对实例成员变量(依赖于对象)
    {
        System.out.println("instance init block");
    }
    private int a=method1();//普通的成员变量,对象级别的
    private static int b=method2();//静态的成员是共享的,类级别的
    private int method1() {
        System.out.println("对象级别的method 1");
        return 1;
    }
    private static int method2() {
        System.out.println("静态的,类级别的method 2");
        return 2;
    }

    public static void main(String[] args) {
        /**
         * new ObjectInitTest()
         * 对象的产生过程
         * 1. JVM会在ObjectInitTest.class文件
         * 2. 先加载类级别的成员(静态成员变量的方法 以及 静态初始化块,这两个打印的顺序依据出现的先后顺序)
         * 3. 再加载对象级别的成员(实例初始化块、普通成员变量的方法,打印的顺序依据出现的先后顺序)
         * 4.构造函数
         */
        ObjectInitTest o=new ObjectInitTest();
    }
}

 继承类同理:  静态>普通        基类>继承类

先打印基类的静态方法以及静态初始化块(根据出现的先后顺序),再打印子类的静态方法及静态初始化块(先后顺序)。

再打印基类普通的方法以及普通实例化块(先后),最后打印基类的构造函数;再打印子类的普通方法及普通实例化块(先后),最后打印子类的构造函数

public class ObjectInitTest2 extends ObjectInitTest {
        private  static int c=method3();
        public static int method3(){
            System.out.println("这是继承类的静态方法");
            return 3;
        }
        static{
            System.out.println("继承类的静态初始化块");
        }
        private int d=method4();
        public int method4(){
            System.out.println("这是继承类的普通的成员方法");
            return 4;
        }
    {
        System.out.println("继承类的普通实例化块");
    }
        public ObjectInitTest2(){
            System.out.println("继承类的构造方法");
        }

    public static void main(String[] args) {
        ObjectInitTest2 o2=new ObjectInitTest2();
    }
}
01-23 04:29