碰到一道蛮有趣的题;记录一下~
问:一下代码输出结果是什么?为什么?
输出结果:
我们改变一下上述代码中的语句执行顺序;再看打印结果如下:
从以上两个结果中可以看到,当语句public static B t2 = new B();改变了顺序之后;结果顺序也相应的发生了改变;是什么原因导致的呢?
个人分析(通过查阅相关资料),可能与标准答案有所出入。。。
先分析类加载的过程:
1.类的加载其实就是jvm虚拟机对.class字节码文件的加载
2.当配置了classpath环境变量后,jvm虚拟机会到classpath所指路径下寻找对应.class文件;如果没有配置,只会在当前路径下寻找(classpath需手动新建配置)
注:
加载过程中,类中的静态成员是随着类一起出现的,被加载到方法区的静态区中;
接着会给静态区中的所有静态成员变量开始默认初始化;
当所有的静态成员变量默认初始化完成之后,开始给所有的静态成员变量显示初始化;
当所有的静态成员变量显示初始化完成之后,开始执行类中的静态代码块;
类中所有的静态代码块执行完成后,当前这个类加载结束
上面代码中的t1,t2在我看来是静态成员变量;所以要先对其进行初始化,即对象的初始化;所以会先执行构造代码块;
执行结束后,开始执行代码中的静态代码块,因为静态代码块随着类加载只会执行一次,所以显示只有一次;
综上所述,结果便如上面控制台输出显示的那样。
(个人分析,仅供参考!!!)