java类的生命周期(一)

目录

概述

一、加载

二、连接

    2.1验证  ​   

    2.2准备

    2.3解析

三、初始化

四、使用

五、卸载


概述

java类的生命周期大致会经历一下几个阶段:加载——>连接——>初始化——>使用——>卸载。其中加载、连接、初始化阶段都是在程序“运行”期间(runtime)完成的,这是Java代码的特点,有很多其他的面向对象语言它们的类型的加载、连接阶段其实是在程序“编译”阶段完成的,java的这种特性其实为我们的程序提供了更大的灵活新和更多的可能性,当然这一点对像我这种菜鸟感受可能不是太明显,但对于一些有创意的大神来说优点就非常明显,比如对于已经生成的多种文件,我们可以在这些文件“运行”的时候做一些“手脚”,让这些文件在运行的过程中有机的结合起来,产生1+1>2的效果。下面我们分别就每个阶段展开来说一说。

一、加载

我们在不同的开发工具(Eclipse、IDEA等)编写完Java代码后,这些IDE会为我们自动把Java文件编译为为class文件(class文件是二进制数据),并把这些class文件存放到我们电脑某个磁盘中。类的“加载”就是由Java中的类加载器(ClassLoader)去磁盘中查找这些class文件,找到后把它们加载到JVM中(内存中),这就是类的加载过程,可见加载过程还是比较简单的。

二、连接

连接阶段的主要作用是确定类与类之间的关系,比如我们定义了一个Student类,而这个类的成员变量有一个引用类型,如下代码所示,那么这个阶段就是主要确定Student类和Address类之间是个什么关系的作用。

class Student{
    int age = 20;
    String name = "zhangsan";
    Address address = new Address("北京");

}

连接这个阶段其实可以进一步细分为如下三个阶段:验证、准备、解析。每一个小的阶段都有其不同的职责和任务。

    2.1验证

        验证阶段的主要作用就是确保被加载的类的正确性,也就是确保第一个阶段加载的class文件的正确性。因为我们知道Java源码编译后产生的class文件是放在我们的磁盘中的,我们完全可以找到并打开它后在里面胡乱改一通。如果你乱改错了,那么在这个阶段就会被校验出来。直观的感受一下某个类的class文件长啥样:

                    

                 用十六进制工具打开后:

                       

    2.2准备

        为类的“静态变量”分配内存,并将其初始化为“默认值”。这里需要格外注意一下,假如我们定义的一个类中有如下一个静态成员变量static int num = 10;准备阶段会把num赋值为int的默认值0,之后(初始化阶段)才会将0修改为10。

    2.3解析

        这个阶段的主要作用就是把类的“符号引用”转换为“直接引用”。这里关于符号引用和直接引用的概念可以简单的理解为符号引用就是一种间接的引用方式,它是通过符号的表示来引用一个类,而直接应用就是直接通过内存地址来指向某个类。比如我们在com.classperiod包下创建了一个Student类,前期阶段,还不知道类的具体内存地址,只能使用com.classperiod.student来代替student类,com.classperiod.student就称为符号引用,而到了解析阶段就可以将com.classperiod.student映射成Student类的内存地址,以后就用内存地址来代替Student类,这种使用内存地址来使用类的方法称为直接引用。

三、初始化

类的初始话阶段就是给类中的static变量赋予正确的值,像我们上面所讲的在类的连接中的准备阶段,jvm只是给num赋了一个默认值0,而到了初始化阶段才会为其赋上我们真正定义的值10。

四、使用

使用这个阶段我们就很熟悉了,这也是平常和我们程序人员打交道最多的一个阶段,像我们平常new一个对象出来、调用类中的方法等等都属于使用阶段。

五、卸载

类在加载的时候把class文件加载到了内存中去,那么它就会驻留在内存中,卸载的主要作用就是把它从内存中去除掉,当一个类被卸载掉以后我们就不能通过new关键字来创建它的对象了。我们在平常的开发中一般很少会接触到卸载的概念,它只会在一些特殊的场景中用到,我们了解即可。

综上,一个类从加载,到使用,再到最后的被卸载,一共会经历加载、连接、初始化、使用、卸载这五个完整的阶段。最后上一张图最为收尾总结:

                     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章