public class Test {
public static void main(String[] args) {
System.out.println(AAA.str);
}
}
public class AAA {
static {
System.out.println("AAA init");
}
public static /*final*/ int str =334;
}
工具:idea
1.编译Test、AAA后执行,输出AAA init 和334
2.放开AAA中的final修饰,main方法执行,竟然输出了AAA init和334
(PS:这种情况不是应该不触发AAA类的初始化吗?)
3.在2的前提下,修改str值为335,main方法执行,此时输出了335
4.在3的前提下,把str的值修改回334,main方法执行,此时输出了334
从代码来看第2步和第4步的代码一样的,为啥输出的结果不一致呢?
调查出来的原因是因为idea有自己的编译机制,如果单独只添加修饰符,idea不认为AAA中的str有变更,这样就导致Test类不重新编译,从而出现了步骤2这种情况,步骤4时,检测到了str值有变更过,从而Test进行编译,那打印出来的结果就是我们期待的结果了。
网友评论