关于类加载顺序的六道题,你都会吗?

不多bb,先上结论:

1、一个类会被类加载去预加载,被加载的类,不一定被初始化。

2、类只有在首次被使用的时候,才会被初始化,也就是类只会被初始化一次。

下面是六道题目,思考一下输出结果应该是什么?

Q1

 

结果是:

MyParent1 static block

hello world

分析:在这里MyChild1和MyParent1都是被加载了,但是只有MyParent1被初始化了。因为没有使用MyChild1,所以它不会被初始化。

Q2,对上边Q1的修改

 

结果是:

MyParent1 static block

MyChild1 static block

welcome

分析:初始化子类的时候,一定会初始化其父类,这次是两个类都被初始化了。

值得注意的是,只有类之间的继承才是这样,接口间的继承在子接口初始化的时候,不会对其父类接口进行初始化。

Q3

 

结果是:

hello world

分析:因为str是被常量修饰的,在编译阶段常量str会被放到MyTest2的常量池中,跟MyParent2也就没关系了。

不管是其他常量int,float等等常量,都是一样的。

Q4,对上边Q3的修改

结果是:

MyParent3 static code

uuid生成的id

分析:编译期间常量不会被确定,自然不会放到常量池中,会导致MyParent3的初始化。

Q5

结果是:

MyParent4 static block

=====

分析:实例化对象的时候肯定会被初始化,而且只会初始化一次。

Q6,对Q5的修改

结果是:

没有输出

分析:数组类型是由JVM在运行期动态生成的,不会被初始化。

 

有任何问题欢迎留言评论,随时回复!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安逸的程序猿

意思不意思那是你的意思我没意思

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值