阅读《java编程思想》看到了java类加载的一点东西,通过查阅资料总结一下我对java类加载顺序的个人理解
结论
初始化顺序:
- 为静态变量、方法分配内存并赋值(静态方法后面大括号语句不执行,只初始化),执行静态代码块(立刻执行大括号里面的语句)。静态加载顺序自上而下。
- 初始化构造方法(只初始化,等待非静态属性加载)
- 为非静态属性分配内存并赋值
- 执行构造代码块(构造代码块在每次创建对象的时候都会执行一次)
- 执行构造方法
- 非静态代码块 或 静态方法(调用才加载)。
如果有继承关系
- 父类静态方法成员变量代码块
- 子类静态方法成员变量代码块
- 父类构造方法初始化
- 子类构造方法初始化
- 父类非静态属性分配内存并赋值
- 子类非静态属性分配内存并赋值
- 执行父类构造代码块
- 执行父类构造方法
- 执行子类构造代码块
- 执行子类构造方法
接口、内部类等,调用时加载
main方法怎么执行的呢?
参考博客(https://www.cnblogs.com/iceAeterNa/p/4876940.html)
java应用程序的启动在在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程。最后将调用JNIEnv的CallStaticVoidMethod()来执行main方法。
CallStaticVoidMethod()对应的jni函数为jni_CallStaticVoidMethod,定义在/hotspot/src/share/vm/prims/jni.cpp中,而jni_CallStaticVoidMethod()又调用了jni_invoke_static(),jni_invoke_static()通过JavaCalls的call()发起对Java方法的调用