类的生命周期回顾篇



一、JAVA虚拟机和JAVA程序的生命周期


JAVA虚拟机的生命周期和JAVA程序的生命周期一致,当我们在命令行中敲入java命令运行java程序时,java虚拟机进程启动,程序运行,当程序终止时,则JAVA虚拟机的生命也结束。


二、类的生命周期


1.加载将.class文件的二进制数据放到内存方法区中,并在堆区中创建一个Class对象,这个Class对象封装了方法区的数据结构,用户能通过Class对象访问到方法区中。

2.连接

(1)验证:验证.class文件是否是通过JAVA程序编译出来的,因为有可能这个.class文件是黑客特意制造出来的。

(2)准备:为类中的静态变量分配空间,并初始化为默认值。
(3)解析:把类的符号引用变为直接引用。

3.初始化:为静态变量和静态块赋予值。

JAVA程序对于类的使用方式:

(1)主动使用。

(2)被动使用。

这里注意:

JAVA虚拟机对于加载和连接的时间节点是很宽松的,没有严格规定,可以提前加载也可以;但是对于初始化,JAVA虚拟机规定当某个类被主动使用时才能初始化。

我们把3个步骤细讲一下:

1.类的加载:类是通过类加载器进行加载。

类加载的来源:

(1)文件系统中的class文件

(2)jar包

(3)网络中下载。

类加载目的地:内存。

类加载器分类:

(1)根类加载器:没有父类,加载java.lang.*。

(2)扩展类加载器:父类是根类加载器,用于加载jre\lib\ext的jar包。

(3)系统类加载器:父类是扩展类加载器,用于加载classpath的jar包。Class scl = Class.getSystemClassLoader();

(4)自定义加载器:自定义加载,通常父类是系统类加载器。

注意:通过类虚拟机自带的(1)(2)(3)加载器是JAVA虚拟机创建的,而他们加载的类,他的生命周期是虚拟机的生命周期,因为始终被加载器锁引用。

2.类的解析

将符号引用转换成直接引用。比如:

A函数调用了B函数,原本只是符号引用即标明引用了B函数,直接引用是将符号改成指针指向B函数。

3.类的初始化

规则:

(1)初始化的静态变量都是运行时变量,即不能在编译时就能判断值是多少。

(2)初始化的顺序就是按照代码的顺序执行。

(3)如果初始化子类时父类还没有被初始化,则先初始化父类。

初始化时机:当遇到以下情况会进行初始化。

(1)new创建实例、反射创建实例、clone创建实例、反序列化创建实例。

(2)访问静态变量,即读和写。

(3)调用静态方法。

(4)启动类需要首先初始化。

(5)Class.forName();

注意:

(1)当遇到编译时常量,则直接用数字替换,而不会导致类初始化。比如public static final int a= 3;这就是一个编译时常量。

(2)当子类对象调用父类的静态变量或方法,则只对父类进行初始化。比如:Sub.a,其中a是父类的静态变量,则只对Base初始化。

(3)当子类被初始化时,父类一定要先初始化;

但是如果一个类实现了一个接口,当类被初始化时,不用初始化父接口。

只有对这个接口进行访问时,才会对接口进行初始化。

(4)loader.loadClass("....");只是对类的加载,而不是初始化。


类加载过程采用“父亲委托机制”,即如果loader2的父类是loader1,loader2想要加载test类,则先会检查loader1是否能够加载test类,如果能,则通过父类加载。

运行时包的概念:包名相同,类加载器相同。

优质内容筛选与推荐>>
1、5.虚函数,覆盖,多态,异常处理
2、[转]Vim配置与高级技巧
3、第十三篇 字符编码延申
4、内部链接十二条网页黄金规则
5、教你如何用 React 实现 Github OAuth 验证


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号