欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

举例说明Java中代码块的执行顺序

发布时间:2023/12/18 java 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 举例说明Java中代码块的执行顺序 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

结论
    这里先把整理好的结论抛给大家,然后我在写个程序来验证我们的结论。在Java类被new的过程中,执行顺序如下:

  •     实现自身的静态属性和静态代码块。(根据代码出现的顺序决定谁先执行)
  •     实现自身的非静态属性和非静态代码块。
  •     执行自身的构造函数。

    在实现继承的类被new的过程中,初始化执行顺序如下:

  •     实现父类的公共静态属性和静态块级代码。
  •     实现自身的静态属性和静态块级代码。
  •     实现父类的非静态属性和非静态代码块。
  •     执行父类的构造函数。
  •     实现自身的非静态属性和非静态代码块。
  •     执行自身的构造函数。

    这里需要简单的介绍一下静态代码块和非静态代码块。
1. 静态代码块:

    static {  
    } 

2. 非静态代码块

    {  
    } 

    静态代码块和非静态代码块的异同点如下:

  •     相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。
  •     不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只在第一次new时执行一次,之后不再执行。而非静态代码块每new一次就执行一次。


验证
    对于结论的最好验证就是写出代码来进行结果证明。首先,来看一下无继承的类初始化时的执行顺序,代码如下:

 

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 publicclass InitOderTest {   publicstatic String STATIC_FIELD = "静态属性";        // 静态块   static{     System.out.println(STATIC_FIELD);     System.out.println("静态代码块");   }        publicString field = "非静态属性";        // 非静态块   {     System.out.println(field);     System.out.println("非静态代码块");   }      publicInitOderTest() {     System.out.println("无参构造函数");   }        publicstatic void main(String[] args) {     InitOderTest test = newInitOderTest();   } }

    执行结果:

  •     静态属性 
  •     静态代码块 
  •     非静态属性 
  •     非静态代码块 
  •     无参构造函数 

    接下来,我们验证一下,当Java类实现继承后,执行顺序是否和我们的结论吻合。测试代码如下:

   

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 classParentTest {    publicstatic String PARENT_STATIC_FIELD = "父类-静态属性";        // 父类-静态块    static{      System.out.println(PARENT_STATIC_FIELD);      System.out.println("父类-静态代码块");    }        publicstatic String parentField = "父类-非静态属性";        // 父类-非静态块    {      System.out.println(parentField);      System.out.println("父类-非静态代码块");    }        publicParentTest() {      System.out.println("父类—无参构造函数");    }  }      publicclass InitOderTest extendsParentTest {    publicstatic String STATIC_FIELD = "静态属性";        // 静态块    static{      System.out.println(STATIC_FIELD);      System.out.println("静态代码块");    }        publicString field = "非静态属性";        // 非静态块    {      System.out.println(field);      System.out.println("非静态代码块");    }        publicInitOderTest() {      System.out.println("无参构造函数");    }        publicstatic void main(String[] args) {      InitOderTest test = newInitOderTest();    }  }

    执行结果如下:

  •     父类-静态属性 
  •     父类-静态代码块 
  •     静态属性 
  •     静态代码块 
  •     父类-非静态属性 
  •     父类-非静态代码块 
  •     父类—无参构造函数 
  •     非静态属性 
  •     非静态代码块 
  •     无参构造函数

总结

以上是生活随笔为你收集整理的举例说明Java中代码块的执行顺序的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。