李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(三)--常量的本质含义
Leefs
2019-11-13 AM
1508℃
0条
# JVM学习(三)--常量的本质含义 ### **代码** ```java public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent2.str); } } class MyParent2{ public static String str = "hello world"; static{ System.out.println("MyParent2 static block"); } } ``` > 输出结果 ```visual basic MyParent2 static block hello world ``` > 代码分析 主函数中调用类`MyParent2`中的`str`变量,从而实现对`MyParent2`类的主动使用,对`MyParent2`进行初始化,执行`MyParent2`中的静态方法,调用`str`输出**hello world.** **对上述代码进行修改** ```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 ``` 加上final关键字以后`MyParent2`中静态代码块没有执行到,Why? 加上final之后,`str`就表示一个常量,不会在发生变化。 > 常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中, > > 本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量 > > 的类的初始化 注意:这里指的是将常量存放到了`MyTest2`的常量池中,之后`MyTest2`与`MyParent2`就没有任何关系了 甚至,我们可以将`MyParent2`的class文件删除,对运行结果并不造成任何影响。 ### 通过反编译对进行分析 1. 1.进入到IDEA当中的Terminal中的黑色输入框当中: ![JVMTest003.png][1] 2. 2.通过输入指令进入到`productioin`文件的下一个文件的目录当中,去反编译class文件 ```java $ cd out/production/offer_Test1/ ``` 3. 3.使用指令反编译指定的class文件 ```java $ javap Jvm_Test.MyTest2 ``` ![JVMTest004.png][2] 4. 4.添加-c命令打印出对应的字节码文件 ```java $ javap -c Jvm_Test.MyTest2 ``` ![JVMTest005.png][3] 通过反编译后的代码可以明显看到加载了**"hello world"**但是没有加载`MyParent2`类就直接输出了。 > 助记符: **ldc:**表示将int,float或是String类型的常量值从常量池中推送至栈顶 **bipush:**表示将单字节(-128 ~ 127)的常量值推送至栈顶 **sipush:**表示将一个短整型常量值(-32768 ~ 32767)推送至栈顶 **iconst_1:**表示将int类型1推送至栈顶 (iconst_1 ~ iconst_5) [1]: https://lilinchao.com/usr/uploads/2019/11/621652415.png [2]: https://lilinchao.com/usr/uploads/2019/11/1368829078.png [3]: https://lilinchao.com/usr/uploads/2019/11/3981324917.png
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/161.html
上一篇
使用jQery完成下拉列表左右选择
下一篇
使用Jquery完成表单校验
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Redis
Flume
JVM
机器学习
Hadoop
FileBeat
LeetCode刷题
Jenkins
数据结构
nginx
设计模式
MySQL
NIO
Java阻塞队列
Git
持有对象
栈
查找
SQL练习题
Stream流
RSA加解密
并发线程
DataWarehouse
Livy
JavaScript
Azkaban
稀疏数组
Quartz
Spark RDD
微服务
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞