概述:

本文通过引入一道面试题来解析类加载、类链接、类初始化过程,以及创建创建对象、对象初始化和程序执行的过程。

你将收获:

1、精通类加载、类链接、类初始化过程

2、深入源码层面了解类初始化、对象初始化的原理

3、额外的收获。(- 解不出题的人收获)

目录:

1、面试题

2、类加载、类链接、类初始化的知识点

3、深入字节码源码,解析面试题

4、答疑解惑

5、全文知识点总结

话不多说,开干! :说说下面程序的输出是什么?

(答案在文末),如果你有疑问,尝试看看下文。

在解释程序前,我们先铺垫类加载、链接、初始化、创建对象、对象初始化的知识点,简单举例说一下程序是怎么运行起来的,这样更有利于大家解题:

程序执行的流程:

1、输入“java Test”命令

JVM企图运行Test类的main方法,发现Test类没加载到内存中

2、JVM加载、链接、初始化Test类。

这里加载、链接两个概念不明白不要紧,不影响我们解题。但要说说“类初始化”的概念,因为从类初始化这步开始涉及            java代码的执行

    初始化概念:初始化是指执行类或接口的初始化方法<clinit>(<java虚拟机规范>的描述)。这里的<clinit>方法,大家是         虚拟机自己生成的一个方法,在初始化阶段被JVM执行,后面会看到。

    初始化规则:static变量初始化代码和static代码块中的代码,在类初始化这步按照在代码中书写的顺序被执行。类初始化         前,其直接超类已经被初始化,直接超类的直接超类也需如此(<java虚拟机规范>的描述)。

3、执行Test类的main方法

前面知识的铺垫,还是有点抽象,那么我根据javac编译后的字节码翻译一下代码,这样就会有个具体的直观认识:

答疑解惑:

其实很多人最大的疑问是在“ static Son son = new Son();”这行代码,这里不用纠结,虚拟机规范并没有规定类初始化阶段    不能执行创建对象的逻辑。说白了,类初始化就是JVM执行代码的过程,没什么特别的。

看完上文的解释,大家是不是清楚了这里程序的输出呢!

全文知识点总结:

1、javac编译实现:

javac编译器生成一个<clinit>方法,把“静态变量的初始化语句”和“static代码块语句”按照代码中的顺序编译到<clinit>方法中;

javac编译器把“实例变量的初始化语句”和“实例代码块的语句”按照代码中的顺序编译到了构造方法中;

以上两点从翻译的代码中可以看出来。

2、类初始化:

类初始化前,其直接超类已经被初始化,直接超类的直接超类也需如此。即javac生成的 <clinit>方法由JVM在“类初始化阶段”调用,调用类的<clinit>方法前,必须先调用父类的<clinit>方法。

3、创建对象、对象初始化 

执行构造方法在堆中创建一个对象。在没有显示调用父类构造方法情况下,所有构造方法的首行都会隐含调用父类的无参构造方法。

更详细解析参照:http://gitbook.cn/gitchat/activity/5db3f2c857529f30fbf2bac4

有问题可以加微信群讨论一下:

程序输出:


4father init block
6Father constructor
1son init block
3son constructor
5Father static block
2Son static block
4father init block
6Father constructor
1son init block
3son constructor
---end---

深入 JVM 字节码,解析类加载、链接、初始化、创建对象、对象初始化、程序执行的流程相关推荐

  1. JVM 字节码解析过程

    微信公众号:运维开发故事,作者:老郑 概述 ===== 概述本文主要是基于 .class 文件,进行分析 .class 文件的内容. 这部分个人觉得主要是属于设计机构拓展的内容,大家可以一起来学习一下 ...

  2. 【JVM · 字节码】指令集 解析说明

    1. 概述 Java字节码指令对于虚拟机,就好像汇编语言对于计算机,属于基本执行指令. Java虚拟机的指令由 一个字节长度 的.代表着某种特定操作含义的数字(称为 操作码/Opcode)以及跟随其后 ...

  3. 【JVM源码解析】模板解释器解释执行Java字节码指令(上)

    本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...

  4. JVM与字节码——2进制流字节码解析

    为什么80%的码农都做不了架构师?>>>    字节码解析 结构 本位将详细介绍字节码的2进制结构和JVM解析2进制流的规范.规范对字节码有非常严格的结构要求,其结构可以用一个JSO ...

  5. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  6. JVM字节码指令集大全及其介绍

    Java是怎么跨平台的 我们上计算机课的时候老师讲过:"计算机只能识别0和1,所以我们写的程序要经过编译器翻译成0和1组成的二进制格式计算机才能执行".我们编译后产生的.class ...

  7. java开发C语言编译器:把C实现的快速排序算法编译成jvm字节码

    有了前面一系列的铺垫和准备后,我们终于能走到至关重要的一刻.在本节,我们将用C语言开发快速排序算法,然后利用我们的编译器把它编译成java字节码,让C语言编写的快速排序算法能在java虚拟机上顺利执行 ...

  8. java 字节码详解_Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  9. 2个字节能存多少个16进制_初探JVM字节码 - 疾风老头

    作者: LemonNan 原文地址: 代码地址: 字节码 概述 本篇要介绍的是能 "一次编译,到处运行的 JVM 字节码" 为什么能到处运行? 是因为在 任意平台下所编译出来的 c ...

最新文章

  1. ubuntu16.04安装新版本golang
  2. CentOS 搭建svn服务器
  3. shell脚本实现无密码交互的SSH自动登陆
  4. windbg调试堆破坏
  5. SQL Server-聚焦使用索引和查询执行计划(五)
  6. 使用Tenorshare iCareFone for mac如何对iPhone进行系统修复?
  7. 已知X随机变量的情况下,求解Y=G(x)的概率分布函数(只考虑单调的情况)
  8. RTL8152B-VB-CG usb转网口芯片驱动指示灯驱动调试
  9. Qt QChartView class
  10. 【开工】知道创宇网络安全线上服务指南
  11. php实现ctrl+f,Ctrl+F 到底有多好用?这 5 个骚操作,让你变身快捷键达人
  12. 万字长文带你探究 Docker 容器化技术背后的黑科技
  13. 专升本英语——语法知识体系(入门部分)
  14. 使用计算机视觉来做异常检测
  15. 云虚拟主机☀️利用FileZilla,使用FTP协议给阿里云虚拟主机上传、下载文件
  16. 甘肃地形图之陇右地形分析、DEM数据下载
  17. Windows7重装系统后文件夹权限的混乱
  18. QT自定义简单表盘(完整代码)
  19. 《智能家居》培训第四天------2019-01-08
  20. 如何向icloud上传文件_怎么把文件上传到icloud

热门文章

  1. [Ext JS 4] 布局之实战一 - 中间区块不会自动伸展 (tab)
  2. java调用远程主机shell_Java 执行远程主机shell命令代码
  3. android expandablelistview横向,Android ExpandableListView使用小结(二)
  4. java期末考试编程题 界面_救急啊!!!期末考试!怎样用JAVA的GUI(图形用户界面)来设计一个小程序!...
  5. html加了文档声明之后页面错乱,为登陆页面扩展和配置设计导入程序
  6. oracle中断进程,中断ORACLE数据库关闭进程导致错误案例
  7. JDK8新特性(十二)之并行的Stream流
  8. Python中pip包管理工具的源配置文件pip.ini
  9. linux getit文件乱码,winzipaes文件名乱码解决方案
  10. java switch case怎么判断范围_java小白从入门到精通(基础二)