类加载器
1,JVM中几个比较重要的内存区域,还有其他区域,这几个区域在类的的生命周期中扮演着比较重要的角色。
方法区:存放类信息,常量,静态变量,方法代码。
常量池:常量,类中的符号引用。
堆:用来存放类的实例对象。
栈:先进后出,存放代码运行时产生的临时变量,局部变量,方法出口等。并且本身通过栈帧存放数据,当方法调用完成后,栈帧消失。
2,java类的生命周期
-指的是一个class文件从加载到卸载的全过程。
-具体指5个阶段:加载-连接-初始化-使用-卸载
-也有可能直接跳过初始化
3,类加载器执行的三部分
加载:查找并加载类的字节码文件。
连接
-验证:确保被加载类的正确性。
-准备:给类的静态变量分配内存,并将其初始化为默认值。
-解析:把类中的符号引用转换为直接引用。
初始化:为类的静态变量赋予正确的初始化值。
-分为两个部分
1,静态变量的初始化
2,静态代码块的初始化
这i两种初始化统一归为静态变量的初始化。
4,结论:
1,类加载的最终产品/目标时位于堆中的class对象。
2,java虚拟机给我们提供了两种类加载器:
-虚拟机自带的加载器
-用户自定义加载器,在java.lang.ClassLoader的子类。
5,java程序对类的使用
-主动使用
-被动使用
关键点:java虚拟机实现必须在类/接口被java程序首次主动使用时才会初始化它们。
主动使用:六种
1,创建类的实例。
2,访问某个类/接口的静态变量,或者对静态变量赋值。
3,调用类的静态方法。
4,反射。
5,初始化类的子类。
6,服务器启动时被标明启动的类。
6, 类的初始化步骤:
不针对接口—
1,如果父类还没有初始化,那么子类初始化之前会现初始化父类。
2,对子类的初始化会对父类初始化,但是对父类的初始化不会对子类初始化。
–初始化子类的时候,并不会初始化父接口。
–初始化接口时,并不会初始化父接口。
–只有当程序首次使用特定接口的静态变量时,才会导致初始化接口。