兄弟们,明天就不多比比了,间接上菜 !!!
作为Java开发的同学们,常常会见到如下代码
public class ClassTest { public final int fValue = 3; public static final int sfValue = 3;}
这段源码文件就定义了两个变量,一个为static,一个为static final。这两个变量是啥意思我就不多说了吧,假如你不晓得,我重大狐疑你在成心你在跟我开玩笑!
玩归玩,闹归闹,别拿兄弟开玩笑,这两个变量在源码档次上很容易了解,然而static和final会对Class文件产生什么影响呢?
透过文章题目能够分明,这两个修饰符关联Class文件中ConstantValue属性的生成,ConstantValue只作用于字段表。
ConstantValue从字面上看是常量,或者此时很多不相熟Class文件的读者敌人们间接通过你们谬误的直觉给出了我答案,只有被final润饰的字段就会生成ConstantValue。
事实是残暴的,往往大失所望,你要做的只不过是Java虐你千百遍,你要待它如初恋!!! 这样你才有可能抱得美人归。
其实仔细的读者敌人们必定曾经通过题目发现,只有static或者static final才可能生成ConstantValue,到这里咱们曾经判定如果要生成ConstantValue必须要有static润饰(Class文件层面上字段表的标记上必须要ACC_STATIC)。
那么final到底对ConstantValue的生成有啥影响呢??
Java虚拟机标准规定了只有被static润饰的变量就会生成ConstantValue属性,只不过javac编译器在实现时退出了final的限度。也就是说javac编译器只会为被static final润饰的字段生成ConstantValue属性。
那么是不是只有被static final润饰的字段就会生成ConstantValue,只有你敢说是,那么Java就立马打你的脸,上(看)正(下)菜(图)!!!
attribute_name_index和attribute_length就不讲了,不明确的能够订阅一下我的JVM系列文章!!!
constantvalue_index是在Class文件常量池的索引,那么这个索引所在的地位是个字面量,因为在Class文件常量池中只有根本类型和和字符串绝对应的字面量,因而ConstantValue只反对为根本类型和String生成,如果你非要Java为其余类型生成,说切实有点强人所难。
作为一个始终幻想领有乏味灵魂的我,怎么可能只带大家干饭呢,再给大家上点饭后水果!!!!
巴拉巴拉讲了一大堆,那么ConstantValue属性生成了到底有啥子用?
这就牵扯到虚拟机对变量的初始化,对于非static变量初始化会在实例结构器<init>办法中进行,然而对于static润饰的类变量,则能够抉择在类结构器<clinit>中或者应用ConstantValue属性进行初始化(这个次要取决于各类编译器的实现)
本期的ConstantValue属性就介绍到这,咱们下期再见!!!
我是shysh95,心愿能够和你专一技术的路上并肩作战,长按或者扫码关注微信公众号,更多精彩文章!!!