搜索
写经验 领红包

接口的初始化规则是什么(接口的初始化规则是)

导语:接口的初始化规则

在JVM类加载这篇文章中,已经确定一个类在初始化时必须先行初始化其父类(如果有),我们接着来看接口的初始化,我们明白接口中的成员属性都是public static final修饰的,例子中省略不写!!!

结论:父接口的实例化块的内容并未输出,证明在初始化一个类时,并不会先初始化它所实现的接口,我们接着往下看!

结论:仅仅只输出子接口的实例化块的内容说明了在初始化一个接口时,并不会先初始化它的父接口,下面输出的是线程重写的toString方法不影响得出的结论!

注意:只有在真正使用到父接口的时候(如引用接口中所定义的常量时),才会初始化,这点与类不同;另外与类一样,被final修饰的静态成员变量初始化所被赋予的值不确定时(运行期确定)不会被放置在常量池当中,所以需要类运行时存在

再来看一个例子加深类加载器准备阶段(赋默认值)与初始化阶段(赋正确值)

new的时候调用构造方法,调用前给两个静态变量赋值,二者都是0然后+1,所以结果都是输出1,我们变换顺序看下面程序

这里counter1准备阶段赋值和初始化后的值都为0后,然后再进入到Singleton的构造方法中,而counter2赋默认值0后进入构造方法为1,最后再初始化值为正确值0,都是根据程序本身的执行顺序进行初始化阶段,下图进一步验证!!!

反思:上图的例子也从侧面反映了准备阶段赋予默认值的重要意义,因为在counter2进行初始化之前,也就是将它赋予正确值0之前,在构造方法中的counter2就无法进行运算,因为它没有默认值0,也反映出类加载过程的合理性!

本文内容由快快网络小德创作整理编辑!