方法加载顺序
(图片来源网络,侵删)在Java中,当一个程序运行时,它会涉及到多个类和方法的调用,了解这些方法的加载顺序对于理解程序的执行流程至关重要,下面将详细解释Java方法的加载顺序。
1. 类的生命周期
我们需要了解Java中类的生命周期,它包括以下几个阶段:
加载(Loading)
链接(Linking)
初始化(Initialization)
使用(Using)
(图片来源网络,侵删)卸载(Unloading)
2. 加载(Loading)
类的加载指的是将class文件的二进制数据读入到内存中,将其储存在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,作为方法区这个类的数据访问入口。
3. 验证(Verification)
这是链接阶段的第一步,这一阶段的目的是确保加载的类满足Java语言的语义要求,确保加载的字节码没有造成危害。
4. 准备(Preparation)
准备阶段正式为类变量(也称为静态变量)分配内存,并设置默认初始值。
(图片来源网络,侵删)5. 解析(Resolution)
在解析阶段,Java虚拟机会把常量池内的符号引用替换为直接引用。
6. 初始化(Initialization)
初始化阶段则是执行类构造器
7. 使用(Using)
所有准备工作完成后,便进入使用阶段,如果一个类被初始化了,它就可以被应用程序使用了。
8. 卸载(Unloading)
当一个类不再被需要时,它的加载的字节码会被卸载出内存。
9. 方法调用的顺序
当一个Java程序开始运行,JVM会按照以下顺序执行:
1、父类静态变量和静态代码块:按照代码从上到下的顺序执行。
2、子类静态变量和静态代码块:同样按照代码从上到下的顺序执行。
3、父类非静态变量和代码块:按照代码从上到下的顺序执行。
4、父类构造函数:按照代码从上到下的顺序执行。
5、子类非静态变量和代码块:按照代码从上到下的顺序执行。
6、子类构造函数:按照代码从上到下的顺序执行。
每当一个类第一次被使用时,都会触发上述过程,对于实例方法,只有在对象创建后,通过对象调用才会执行。
表格归纳
| 阶段 | 描述 |
| 加载 | 读取二进制数据到内存 |
| 验证 | 确保字节码正确无误 |
| 准备 | 分配内存给静态变量并设置默认值 |
| 解析 | 替换常量池中的符号引用为直接引用 |
| 初始化 | 执行静态变量初始化和静态代码块 |
| 使用 | 类可以被应用程序使用 |
| 卸载 | 移除不再需要的类的字节码 |
| 方法调用顺序 | 父类静态 > 子类静态 > 父类非静态 > 父类构造 > 子类非静态 > 子类构造 |
相关问答FAQs
Q1: 为什么类的静态变量会在实例变量之前被初始化?
A1: 静态变量是属于类的,而不是属于类的实例,它们在类加载的时候就被初始化,这是因为静态变量是所有实例共享的资源,因此必须在任何实例被创建之前就已经存在,这样可以确保无论创建多少实例,静态变量都只会被初始化一次。
Q2: 如果一个类的父类还没有被初始化,那么这个类的静态变量是否会被初始化?
A2: 不会,在Java中,一个类的初始化会导致其直接父类的初始化,这意味着,如果一个类的静态变量要被初始化,它的直接父类的静态变量必须已经被初始化,这是为了确保父类中的静态方法和变量在子类使用前都是可用的。
上一篇:2017玩游戏选什么显卡
下一篇:高清视频通话应用 _超高清视频