类初始化过程中遇到的坑

2020-01-14  本文已影响0人  奋斗_2339
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进行编译,那打印出来的结果就是我们期待的结果了。

上一篇 下一篇

猜你喜欢

热点阅读