我们在java中经常会用到final这个修饰符,说是用来表示不可变的,经常和static这个变量一起用来修饰类,方法,属性
下面我们来讲讲使用final修饰属性以后对编译的结果是什么
下面的代码是我手动敲的
按理说编译成class文件以后反编译应该是和这个文件是相同的,那么我们看一下反编译以后的结果:
发现了么,输出的地方使用静态的常量和final修饰的常量是不一样的,这是为什么?应该是STRING2才对不是么?是不是很意外
时间太晚了不在做深入的研究,有时候替换一些class文件对于final修饰的常量要注意啊
然后我突然想了下,如果在静态代码块中在对final修饰的常量进行赋值呢
下面是对class反编译的结果
发现没有,这里引用的就是常量的名称,而不是里面实际的代码串
然后我就在想,那么final修饰的变量可以在构造方法中赋值么
结果是不可以的
为什么会出现不同的结果原因找到了,是因为如果直接这样定义String s ="aaa",在编译的过程中java虚拟机会进行优化,把这些东西放到栈中(不知道是不是这样),所以下面反编译的时候引用到s的地方反编译过来全部都是"aaa",但是如果在static代码块中进行赋值的话,java虚拟机是不知道这个变量的赋值是什么,只能使用s来完成对其的引用