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

举报
西魏陶渊明 发表于 2022/09/25 02:11:13 2022/09/25
【摘要】 讨论code 大多数人会认为如果main之后,肯定是先打印出静态代码块内容 如果你也这样认为就错了 要知道当main运行之后 A. 加载字节码到内存(从上到下加载,此时为加载完整,因为因为静态n还未加载)B. 从上到下加载静态方法加载 k->Test t1 当发...

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

4279695-576dd5311d6526c9.png

要知道当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

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

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

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

4279695-1972ef7e345d5f01.png

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


4279695-2790a6530ca94cae.png

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

在本案例中:

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

文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。

原文链接:springlearn.blog.csdn.net/article/details/102425363

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。