不多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在运行期动态生成的,不会被初始化。
有任何问题欢迎留言评论,随时回复!