李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(三)--常量的本质含义
Leefs
2019-11-13 AM
2146℃
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://lilinchao.com/archives/161.html
上一篇
使用jQery完成下拉列表左右选择
下一篇
使用Jquery完成表单校验
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Linux
稀疏数组
持有对象
Filter
Eclipse
MySQL
递归
微服务
算法
Typora
人工智能
Kafka
序列化和反序列化
Azkaban
JavaSE
Hbase
Shiro
gorm
JavaScript
Java工具类
FastDFS
Elastisearch
Elasticsearch
Thymeleaf
CentOS
Yarn
MyBatisX
正则表达式
Tomcat
Map
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭