java是面向对象语言,所有的事物在java语言中都可以抽象成为对象,对象在java中以类的形式存在,那么类是如何加载的呢?
.class文件通过类加载器加载,将类中的二进制数据读入到jvm虚拟机运行时数据区的方法区内,并且对数据进行校验、解析、初始化。最终形成可以被虚拟机直接使用的java类型。
类加载器加载类文件:
1.通过类的全限定名来获取类的二进制流。
2.将获取的二进制流转化成方法区的运行时数据结构
3.在堆内存中创建一个这个类的class对象,作为对方法区中这个数据的访问入口
校验:确保加载类的正确性
1.校验文件格式是否符合规范
2.校验语义、语法是否正确
3.校验符号引用是否正确
准备:为静态变量分配内存、并为其初始默认值
1.静态变量内存分配在方法区内,实例变量会跟随对象一起在堆中分配内存空间。
2.为静态变量赋默认零值,例如public static int a = 10; 在准备阶段,a的值是0,在初始化阶段,a才被赋予10.
解析:把类中的符号引用转换为直接引用
初始化:为静态变量赋指定的值
类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:
1.new创建类的实例
2.调用某个类的静态变量
3.调用某个类的静态方法
4.反射(calss.forName())
5.初始化某个类的子类
6.虚拟机启动的时候被标明要初始化的类