Java类加载执行顺序
直接上图,再做说明:
1.类的静态变量是在准备阶段分配内存并赋默认值的,但还没有define定义
2.类的静态变量是在类初始化的时候define并赋值的
3.类的静态代码块是在类初始化的时候执行的,多个静态代码块谁在前谁先执行。静态块若要调用静态变量,那么变量必须声明在静态块前面,因为静态变量和静态代码块是按顺序来的
4.类的非静态变量和非静态方法是在类实例化的时候初始化和执行的,也是按顺序来的
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法
说明:从上面这个对象初始化顺序我们可以看出,子类若要实例化那肯定要先加载啊,要加载那肯定得先加载他祖宗啊,那就肯定是先执行祖宗的静态内容,然后是自己的静态内容,东西都加载好了初始化好了那就要实例化了,那实例化也得先实例化祖宗,所以要先把祖宗的非静态块执行了构造器执行了才开始执行自己的非静态块和构造器,这样就算是实例化完了