美文网首页java知识笔记与开发经验分享程序员
深入理解JAVA虚拟机学习笔记25——类加载的初始化过程

深入理解JAVA虚拟机学习笔记25——类加载的初始化过程

作者: 徐可心 | 来源:发表于2018-07-04 08:52 被阅读1次

每天进步一点点!

前面已经介绍了类加载的加载、验证、准备、解析等过程,今天来学习最后一个过程,初始化!

对于有过java开发经验的朋友们来说,初始化这个词自然不陌生,初始化阶段与变量初始化自然不是一个概念,但是也有一些关联。

在上一篇中,我们已经看到了在准备阶段,不同变量初始化的区别,实际上,初始化阶段是执行类构造器()方法的过程。

朋友们还记得上一篇中的例子吗(有兴趣的朋友可以看一下上一篇)?按照前面的分析,这个阶段其实是对非final的static静态变量初始化的过程。

注意:初始化过程实际上还会执行静态语句块(static{})中的内容。

既然说到了()方法,自然而然会想到()方法,有的朋友肯定会问,这两个方法长的好像啊,包括有些公司的面试题也会问,这两个方法到底有什么区别呢?

包括笔者在内,以前也经常搞不清楚,下面我们就将这两个方法对比一下。

1. ()方法是类构造器方法,()方法是对象构造方法,从字面意思就可以看出,两个方法面向的主体是不一样的,一个作用于类,一个作用于对象。

()方法的指令来自于静态变量和静态语句块,()来自于类的构造方法。

2.  当存在类继承关系的时候,()方法不需要像()方法那样显式地(super())调用父类的构造器,虚拟机会先执行父类的()方法。

然鹅,but,however,在接口里面,当父接口定义的变量不使用的时候,子接口或实现类执行()方法时,不会调用父接口中的()方法。

这是原书中的说法,但是笔者好奇啊,java为什么这么刁蛮不讲理?

在好奇心驱使下,笔者打开了一个定义了静态变量的接口字节码文件,

呵呵哒……接口中的静态变量编译之后被转换成了final的了,还记得上一篇的内容吗?

在准备阶段,final修饰的变量的值就被绑定了,自然不需要执行()方法了。

到这里,相信大家对final修饰的变量不能被修改,也有了更深的认识。

3.  如上图所示,当类中没有定义静态变量和静态语句块的时候,字节码中并没有()方法,也就是说()方法并不是必须的,但是对于()方法,不管你定不定义,它就在那里不离不弃。

4. ()方法同步安全的,当多个线程调用的时候,只有一个线程去执行这个方法。并且,前面已经提到过,一个类型在同一个类加载器只能初始化一次,其它线程实际并不能再调用这个()方法。

5. 前面的文章中,还提到过另一个点, ()是虚拟机的方法,不能通过程序调用,而()是可以通过程序调用的。

通过以上的分析,我们也可以得出类变量赋值的顺序,依次是:final变量(解析阶段)>static变量(准备阶段)>普通变量(初始化阶段)。

至此类加载的过程基本结束了,接下来将学习字节码执行引擎,自己给自己鼓鼓劲,加油!

喜欢文章或想一起学习的朋友可以关注我,给我点赞,我将会持续更新,有什么疑问或文中有不当之处请给我留言,真诚地希望能与大家一起交流探讨,学习进步。

相关文章

  • Java虚拟机——类加载机制和类加载器

    前言: 本文主要参考《深入理解Java虚拟机》,讲解了Java虚拟机加载.class文件主要流程——类加载过程、几...

  • JVM 类加载的过程

    《深入理解Java虚拟机》- 第三版《深入浅出Java虚拟机》- 李国 前言 Java 虚拟机中类加载的全过程,即...

  • 《深入理解 Java 虚拟机》学习 -- 类加载机制

    《深入理解 Java 虚拟机》学习 -- 类加载机制 1. 概述 虚拟机把描述类的数据从 Class 文件加载到内...

  • JAVA基础之虚拟机类加载机制

    今天学习了《深入理解java虚拟机》的类加载机制,描述类如何被虚拟机加载的具体步骤。 byte、short、cha...

  • 类加载机制的初始化

    类初始化阶段是类加载过程的最后一步,这一步操作是由虚拟机主导和控制的。 你看《深入理解java虚拟机》书的时候,会...

  • 深入理解Java类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟...

  • 深入理解 Java 类加载

    本文目的: 深入理解Java类加载机制; 理解各个类加载器特别是线程上下文加载器; Java虚拟机类加载机制 虚拟...

  • 【类的加载】

    深入理解类加载机制 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最...

  • 类加载机制

    目录 概念 加载过程 初始化时机 类初始化顺序注意点 双亲委派模型 自定义类加载器 类加载 概念 Java虚拟机把...

  • 深入理解Java类加载机制(二)

    1 前言 在深入理解Java类加载机制(一)一文中,我们了解了类的加载和连接过程,这篇文章重点讲述类的初始化过程,...

网友评论

    本文标题:深入理解JAVA虚拟机学习笔记25——类加载的初始化过程

    本文链接:https://www.haomeiwen.com/subject/iwisuftx.html