当前位置:   article > 正文

关于static定义初始化块和静态变量以及初始化块的执行顺序问题

关于static定义初始化块和静态变量以及初始化块的执行顺序问题

首先看下这段代码:

  1. public class Test2 {
  2. static Test2 test1 = new Test2();
  3. static int a =10;
  4. static {
  5. System.out.println(a);
  6. System.out.println("bb");
  7. a=11;
  8. }
  9. public Test2() {
  10. System.out.println("cc");
  11. }
  12. {
  13. System.out.println("aa");
  14. System.out.println(a);
  15. }
  16. public static void main(String[] args) {
  17. Test2 test = new Test2();
  18. }

输出的结果为:

为什么会有这种结果呢?

 对此我的理解是:

  第一步:首先会将所有static定义的成员变量先声明出来,但是不赋初值,并给与默认值,例如(boolean是false,int为0)

  第二步:在类加载的时候,按照从上到下执行static修饰的代码,此时执行static Test2 test1 = new Test2(),也就是创建出一个名为test1的对象

 第三步:首先进行构造方法的执行前,会执行实例初始化块中的代码,此时输出aa以及a的值(由于第一步没赋初值,并且给了默认值为0 所以输出0)

 第四步: 执行构造方法,所以输出cc

 第五步:顺序执行static修饰的代码:static int a =10; //给a变量赋值为10

 第六步:顺序执行static修饰的代码,也就是static修饰的代码块 //首先输出a的值为10 然后输出bb,最后将a的值定义为11

 第六步:此时除了main方法,所有由static修饰的代码全部执行完毕(static修饰的代码只执行一次),类初始化完成,开始执行main方法,main方法中只有一条语句(Test2 test = new Test2()),也就是创建一个test2的对象

 第七步:进行构造方法的执行前,会执行实例初始化块中的代码,此时输出aa以及a的值(11)

 第八步: 执行构造方法,所以输出cc

 此时所有代码执行完毕

好了现在锻炼一个简单的问题吧!

以下代码输出什么呢?

  1. public class Test2 {
  2. static int a =10;
  3. static {
  4. System.out.println(a);
  5. System.out.println("bb");
  6. a=11;
  7. }
  8. public Test2() {
  9. System.out.println("cc");
  10. }
  11. {
  12. System.out.println("aa");
  13. System.out.println(a);
  14. }
  15. public static void main(String[] args) {
  16. Test2 test = new Test2();
  17. }
  18. }

评论区打出答案吧!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/813257
推荐阅读
  

闽ICP备14008679号