
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
Java虚拟机的应用与学习是每一位Java程序员都需要重点掌握的一个编程开发知识点,我们在前几期也给大家简单介绍了类加载的一些基础知识,而本文我们就再来了解一下,Java编程类加载过程包含哪些步骤。
类加载的过程
加载
加载是类加载过程的一步,在类加载器的控制下,将二进制字节流转化为运行时数据。加载阶段需要完成3件事。
根据类的全限定名获取对应的二进制字节流/定义对应的二进制数据流。
将二进制字节流转化成方法区的运行时数据结构。
在堆中创建代表这个类的java.lang.Class对象,作为方法区内数据的访问入口。
这里二进制字节流的获取,有多种方式,源文件也可以有多种形式。比较常见的形式有:
从压缩包中获取,如jar包,war包等。
在程序运行时,动态计算产生。应用场景:动态代理。
常见的,编译.java文件生成.class文件
验证
验证的作用是确保Class文件内的信息符合虚拟机规范的要求,保证程序运行过程中的安全。
准备
为类变量(即静态变量)分配内存,并设初始值。(0,null,false...)。
有两点需要留意:
从概念上讲,应当在方法区内为静态变量赋初值(常量会执行定制化赋值,不是单纯的默认值),但实际上jdk8以后,静态变量随着类对象一起存放在堆内存中。
准备阶段并不会为非静态变量(即实例变量)分配内存,实例变量会在对象实例化的时候,分配内存并赋初始。
解析
将运行时常量池中符号引用替换成直接引用。
解析的作用就是,在引用的对象被加载到内存中以后,将引用替换成指向该对象的指针或句柄。需要被解析的引用有:类或接口的解析、字段解析、方法解析、接口方法解析。
解析的发生时间并没有严格规定,它并非一定发生在准备和初始化之间(动态链接或者动态加载、动态分派等功能实现的场景会延迟到运行阶段)。
初始化
在初始化之前,加载-验证-准备这3步必然是完成了,部分的解析工作也可能完成了。
准备阶段:对类对象中的类变量都是系统默认的初始值(常量会直接赋值,不会等到运行阶段)。
初始化阶段:对类变量赋予我们在代码中指定的值。
在初始化阶段,需要执行类构造器(与实例对象的构造器区分开来)。类构造器并非我们直接编写的方法,而是编译器收集类变量的赋值语句和static代码块的产物。
初始化阶段就是对静态变量赋值和执行静态代码块的过程(父类会在前,子类会在后)。
实例化阶段就是执行实例构造器和实例代码块(构造代码块)的过程。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。