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

>>号外:关注“Java精选”公众号,回复“2021面试题”关键词,领取全套500多份Java面试题文件。

先运行一段程序:

public class MyTest2 {

    public static void main(String[] args) {
        System.out.println(MyParent2.str);
    }

}
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 种优雅的解决方案

MySQL 分页使用 limit 和 offset 参数为什么会导致执行变慢?

全网可能是最全的 JAVA 日志框架适配、冲突解决方案

数据库在哪些场景下导致索引失效,索引何时会失效?

为什么 Redis 越来越慢了?延迟问题定位排查与分析

Spring 框架中导致 @Transactional 事务注解 3 种失效场景分析及解决方法

放弃 JDK8 中 StringBuilder,使用 StringJoiner 辅助类,真香!

面试时这样回答 Java 应用性能调优,回报是更多 Money!

面试官问:你说一说 HashMap 是如何解决 hash 冲突的?

记录 Java 面试中遇到的 http请求、消息处理、线程池 3 个问题及感悟!

点个赞,就知道你“在看”!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值