1,Java的运行过程: 编译》加载》运行
2,
类加载主要是由jvm虚拟机负责的,过程非常复杂,
类加载分三步 加载 》 连接 》初始化,
(这里的加载和本文标题的类加载是不同的,标题的类加载包含了完整的三个步骤)
下面详细说说每一步的过程
2.1、加载:
这个很简单,程序运行之前jvm会把编译完成的.class二进制文件加载到内存,
供程序使用,用到的就是类加载器classLoader ,这里也可以看出java程序的运行并不是
直接依靠底层的操作系统,而是基于jvm虚拟机。如果没有类加载器,java文件就只是磁盘中的一个普通文件。
2.2、连接:
连接是很重要的一步,过程比较复杂,分为三步 验证 》准备 》解析
验证:确保类加载的正确性。一般情况由javac编译的class文件是不会有问题的,
但是可能有人的class文件是自己通过其他方式编译出来的,这就很有可能不符合jvm的编 译规则,
这一步就是要过滤掉这部分不合法文件
准备:为类的静态变量分配内存,将其初始化为默认值 。我们都知道静态变量是可以不用我们手动赋值的,
它自然会有一个初始值 比如int 类型的初始值就是0 ;boolean类型初始值为false,
引用类型的初始值为null 。 这里注意,只是为静态变量分配内存,此时是没有对象实例的
解析:把类中的符号引用转化为直接引用。解释一下符号引用和直接引用。
比如在方法A中使用方法B,A(){B();},这里的B()就是符号引用,
初学java时我们都是知道这是java的引用,以为B指向B方法的内存地址,
但是这是不完整的,这里的B只是一个符号引用,它对于方法的调用没有太多的实际意义,
可以这么认为,他就是给程序员看的一个标志,让程序员知道,这个方法可以这么调用,
但是B方法实际调用时是通过一个指针指向B方法的内存地址,这个指针才是真正负责方法调用,
他就是直接引用。
2.3、初始化:
为类的静态变量赋予正确的初始值,上述的准备阶段为静态变量赋予的是虚拟机默认的初始值,
此处赋予的才是程序编写者为变量分配的真正的初始值