Java类与对象
在我们分析
Java类加载过程前,思博先来和大家聊一聊Java类。我们之前有跟大家一起探讨过Java的面向对象,而类就是面向对象最关键的两个词汇之一,而另一个词汇就是对象。实质上,我们可以将类看作对象的抽象,类是一个模板,它描述一类对象的行为和状态,定义了对象所具有的属性和方法。
Java类加载
那么什么是Java类加载呢?当程序要使用某个类时,需要经过加载的过程,如果该类还未被加载到内存中,则系统会通过
加载,连接,初始化三步来实现这个类进行初始化,而Java类的生命周期还包括了后期的使用和卸载。
以上说到的加载,连接,初始化三个步骤就是Java类加载过程,细分的话,其中链接包括了
验证、准备和解析,当然,并不是每次Java类加载,这三个过程都会顺序执行完。接下来我们就来说说 Java类加载的这三个步骤
一、加载(Loading)
加载是 Java 将字节码数据从不同的数据源读取到 JVM 中,并映射为 JVM 认可的数据结构(Class 对象),这里的数据源可能是各种各样的形态,比如 jar 文件,class 文件,甚至是网络数据源等;它是由类加载器ClassLoader来完成的,加载阶段是用户参与的阶段,我们可以自定义类加载器,去实现自己的类加载过程。
二、连接 (Linking)
类被加载后,就进入连接阶段,连接就是将已经读入到内存中的二进制数据合并虚拟机的运行时环境中去,它由我们前文提到的三个步骤“验证”、“准备”和“解析”组成。
1、验证(Verification)其主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。
2、准备(Pereparation)准备内存空间和数据,这个时候还没有类的实例,唯一属于类的东西就是静态成员了,所以在准备阶段会给类的静态成员变量分配内存,并设置默认的初始值。
3.解析(Resolution)把类的二进制数据中的符号引用转换成直接引用。符号引用就是类中变量名、方法名这些符号表示,其代表的是内存地址或者说指针,也就是这里的直接引用。
三、初始化 (initialization)
初始化是为标记为常量值的字段赋值的过程。换句话说,只对static修饰的变量或语句块进行初始化。它有两种途径:一是变量声明时初始化;二是在静态代码块中进行初始化。没有初始化的静态变量会保持默认值。
最后提一下,类加载过程三个步骤中,初始化并不是一定会执行的,只有在主动使用时才会初始化哦。