一个静态代码块内有一个静态变量
public class SupClass {
static{
System.out.println("我是静态代码块");
}
static String VALUE = "风泊月";
}
测试类,输出
public class Test {
public static void main(String[] args) {
System.out.println(SupClass.value);
}
}
//输出
我是静态代码块
风泊月
在静态变量前+final ,结果就变了
public class SupClass {
static {
System.out.println("我是静态代码块");
}
static final String VALUE = "风泊月";
}
输出结果
这是为什么呢,为什么没有输出“我是静态代码块”?
因为虽然在java源码内引用了SupClass中的常量 value ,但其实在编译阶段通过常量的传播优化,已经将这个VALUE存到了Test类中的常量池内,以后Test 对 SupClass.VALUE 的引用都被实际转化为自身常量池的引用。换句话说,实际上 Test的class 文件中并没有SupClass类符号的引用入口,所以编译后 两个类 就不存在任何联系了。