0

深入理解 Java 代码块

 2 years ago
source link: https://www.diguage.com/post/dive-into-java-code-block/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

深入理解 Java 代码块

2022-09-04
深入理解 Java 代码块

Java 虚拟机操作码探秘:常量指令 中对 Java 虚拟机操作码中关于常量操作的指令(操作码)做了初步介绍。估计会有人疑问:文中的“栈”、“栈顶”等是什么?接下来就准备解答这些疑问。

在答疑解惑之前,先来了解一下 Java 编译器对 Java 代码中的代码块是如何处理的?常见的代码块有普通代码块和静态代码块,下面对其做分别介绍。由于涉及到构造函数,所以,先对构造函数做一个介绍。

无构造函数

先来看看当没有声明构造函数时,编译结果是什么样的:

编译后,使用 javap -c 查看一下编译结果:

从结果上来看:编译器自动给没有声明构造函数的类,生成了一个无参构造函数,并且在其中调用了父类(这里是 Object)的无参构造函数。这是大家都熟知的基础知识。

有参构造函数

再来看看当有声明参数的构造函数时,编译结果是什么样的:

编译后,使用 javap -c 查看一下编译结果:

1只有在参数声明这个地方有差异。

当声明有构造函数时,就不会再创建无参构造函数了。

有了这些知识铺垫,我们就可以开始来说明代码块的处理了。

普通代码块

没有构造函数时

普通代码块是指在 Java 类中使用 {} 声明的代码块。示例代码如下:

编译后,使用 javap -c 查看一下编译结果:

javap 的结果来看,普通代码块消失了,取而代之的是,编译器将其代码嵌入到了由编译器生成的无参构造函数里。还可以反编译看一下:

存在构造函数时

再来看看当存在无参构造函数和有参构造函数时,编译器会如何处理。示例代码如下:

编译后,使用 javap -c 查看一下编译结果:

javap 的结果来看,编译器将代码块代码整体嵌入到了构造函数里。再看一下反编译结果:

构造函数包含代码时

再来看看当构造函数包含代码时,编译器会如何处理。示例代码如下:

编译后,使用 javap -c 查看一下编译结果:

javap 的结果来看,编译器将代码块代码整体嵌入到了构造函数里,并且放在了构造函数原有代码之上。再看一下反编译结果:

当存在多个普通代码块时

再来看看当存在多个普通代码块时,编译器会如何处理。示例代码如下:

编译后,使用 javap -c 查看一下编译结果:

javap 的结果来看,编译器将代码块代码按照出现顺序依次嵌入到了构造函数里,并且放在了构造函数原有代码之上。再看一下反编译结果:

总结一下:普通代码块在编译时,由编译器将代码块代码整体嵌入到了构造函数里,并且放在了构造函数原有代码之上。如果存在多个普通代码块,则按照出现的顺序依次嵌入到构造函数里。从 Java 虚拟机的层面上来看,不存在普通代码块。

静态代码块

静态代码块是指在 Java 类中使用 static 关键字和 {} 声明的代码块。示例如下:

编译后,使用 javap -c 查看一下编译结果:

javap 的结果来看,编译器对静态代码块别没有做什么处理,还是保持了原状。再看一下反编译结果:

加上代码块、构造函数,来执行一下,看看执行顺序。完整代码:

编译执行,结果如下:

从结果上来看,静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,会按照书写顺序依次执行。

内容已经不少,本文先到这里。下一篇文章再来介绍 Java 虚拟机尤其是虚拟机栈相关知识。

看在D瓜哥码字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

微信打赏码
支付宝打赏码

欢迎关注D瓜哥的微信公众号,在公众号可以获取我的微信二维码:

微信公众号
公众号的微信号是: jikerizhi。如果图片加载不出来,可以直接通过搜索公众号的微信号来查找D瓜哥的公众号。
来说两句吧...
我来说两句

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK