兄弟们,明天就不多比比了,间接上菜!!!
作为 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,心愿能够和你专一技术的路上并肩作战,长按或者扫码关注微信公众号,更多精彩文章!!!