java final 学习

来源:互联网 发布:手机接单软件 编辑:程序博客网 时间:2024/05/16 05:57

我们在java中经常会用到final这个修饰符,说是用来表示不可变的,经常和static这个变量一起用来修饰类,方法,属性

下面我们来讲讲使用final修饰属性以后对编译的结果是什么

下面的代码是我手动敲的

按理说编译成class文件以后反编译应该是和这个文件是相同的,那么我们看一下反编译以后的结果:


发现了么,输出的地方使用静态的常量和final修饰的常量是不一样的,这是为什么?应该是STRING2才对不是么?是不是很意外

时间太晚了不在做深入的研究,有时候替换一些class文件对于final修饰的常量要注意啊

然后我突然想了下,如果在静态代码块中在对final修饰的常量进行赋值呢


下面是对class反编译的结果



发现没有,这里引用的就是常量的名称,而不是里面实际的代码串

然后我就在想,那么final修饰的变量可以在构造方法中赋值么

结果是不可以的

为什么会出现不同的结果原因找到了,是因为如果直接这样定义String s ="aaa",在编译的过程中java虚拟机会进行优化,把这些东西放到栈中(不知道是不是这样),所以下面反编译的时候引用到s的地方反编译过来全部都是"aaa",但是如果在static代码块中进行赋值的话,java虚拟机是不知道这个变量的赋值是什么,只能使用s来完成对其的引用

0 0
原创粉丝点击