美文网首页
类初始化过程中遇到的坑

类初始化过程中遇到的坑

作者: 奋斗_2339 | 来源:发表于2020-01-14 19:22 被阅读0次
    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进行编译,那打印出来的结果就是我们期待的结果了。

    相关文章

      网友评论

          本文标题:类初始化过程中遇到的坑

          本文链接:https://www.haomeiwen.com/subject/ttvaactx.html