JVM 原理二:常量的本质含义与反编译及助记符详解

}

class MyParent2{

public static final String str = "hello world ";

static {

System.out.println(“MyParent2 static block”);

}

}

输出的结果就是 :hello world

注意我们在str变量的修饰上加了final修饰符,如果我们不加final修饰符,那么打印的结果会是:

MyParent2 static block

hello world

加了final关键字之后str就会变成常量:

常量在编译阶段会存入到调用这个常量方法所在的类的常量池中

本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类的初始化

注意:我们指的是将常量存放到了Mytest2的常量池中,之后Mytest2与MyParent2就没有任何关系了

甚至:我们可以将MyParent的class文件删除

我们可以试验一下:

程序照样输出 ,而且不会报错,这就验证了上边的介绍。

我们反编译一下Mytest2:

出现一个助记符ldc

助记符:

ldc:表示将int、float、或是String类型的常量从常量池中推送至栈顶。

其实还有其他的助记符:

bipush:表示将单字节(-128 ~ 127 )的常量推送到栈顶

sipush : 表示将一个短整型常量值(-32768 ~ 32767)推送到栈顶

iconst_1 表示将int类型1推送到栈顶(iconst_m1 – iconst_5)

这些助记符其实可以在jdk的com.sun.org.apache.bcel.internal.generic里边可以看到对用的类,是从apache基金会吸收过来的。

作者:魔鬼_

blog.csdn.net/wzq6578702/article/details/79370149

往期精选  点击标题可跳转

JVM原理一:类加载器深入解析与阶段分解

Java 中统计代码执行耗时,列举 4 种优雅的解决方案

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618164986)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值