美文网首页Spring Boot实践记录个人技术栈Java程序性能优化
字节码加载和class实例(静态成员变量对象加载顺序)

字节码加载和class实例(静态成员变量对象加载顺序)

作者: Chinesszz | 来源:发表于2017-09-22 17:59 被阅读17次

    讨论code 大多数人会认为如果main之后,肯定是先打印出静态代码块内容
    如果你也这样认为就错了

    要知道当main运行之后

    • A. 加载字节码到内存(从上到下加载,此时为加载完整,因为因为静态n还未加载)
    • B. 从上到下加载静态方法加载 k->Test t1
      当发现Test是要实例的时候执行顺序是:非静态成员变量->非静态代码块->构造

    实例化顺序:加载 a j
    1:j i=0 n=0 因为k已经加载了所以是0,++k 是先赋值所以就是1[非静态成员变量]
    2:代码块 i=1 n=1 [非静态代码块]
    构造器:3:t1 i= n=2[构造]

    • C.加载Test t2, 重复上面步骤456
      4:j i=3 n=3
      5:代码块 i=4 n=4
      构造器:6:t2 i= n=5

    • D.此时加载静态i
      7:1 i=6 n=6

    • E.开始加载最后一个静态变量n=99后开始加载静态代码块
      1:静态代码块 i=7 n=99

    • F. 到此字节码加载完成到内存

    那么我们如何证明是这样呢?我们来做一个减法!

    我们先把需要实例化的静态的成员变量注释掉,然后运行,不出意外的话,只加载了字节码到内存
    应该只加载了静态成员变量->静态代码块->静态方法


    总结:
    字节码加载 : 静态成员变量->静态代码块->静态方法
    类实例化 : 非静态成员变量->非静态代码块->构造

    在本案例中:

    字节码加载包含了类实例化,所以导致了静态代码块,要等到两个实例化之后最后执行,也就是我们所想的先加载静态代码块,变成了最后才执行

    相关文章

      网友评论

      本文标题:字节码加载和class实例(静态成员变量对象加载顺序)

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