前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >举例说明Java中代码块的执行顺序

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

作者头像
用户10604450
发布2024-03-15 14:44:55
840
发布2024-03-15 14:44:55
举报
文章被收录于专栏:练习两年半练习两年半

结论

这里先把整理好的结论抛给大家,然后来验证我们的结论

在Java类被new的过程中,执行顺序如下:

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

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

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

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

static { }

2. 非静态代码块

{ }

  1. 静态代码块:在类加载时执行,只执行一次。
  2. 非静态代码块:在创建对象时执行,每次创建对象都会执行一次。
  3. 构造方法:在创建对象时执行,每次创建对象都会执行一次。

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

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

验证

对于结论的最好验证就是写出代码来进行结果证明。

首先,来看一下无继承的类初始化时的执行顺序,代码如下:

代码语言:javascript
复制
public class Test { 
  public static String STATIC_FIELD = "静态属性"; 
    
  // 静态块 
  static { 
    System.out.println(STATIC_FIELD); 
    System.out.println("静态代码块"); 
  } 
    
  public String field = "非静态属性"; 
    
  // 非静态块 
  { 
    System.out.println(field); 
    System.out.println("非静态代码块"); 
  } 
  
  public Test() { 
    System.out.println("无参构造函数"); 
  } 
    
  public static void main(String[] args) { 
    Test test = new Test(); 
  } 
} 

执行结果:

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

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

代码语言:javascript
复制
class ParentTest { 
   public static String PARENT_STATIC_FIELD = "父类-静态属性"; 
   
   // 父类-静态块 
   static { 
     System.out.println(PARENT_STATIC_FIELD); 
     System.out.println("父类-静态代码块"); 
   } 
   
   public static String parentField = "父类-非静态属性"; 
   
   // 父类-非静态块 
   { 
     System.out.println(parentField); 
     System.out.println("父类-非静态代码块"); 
   } 
   
   public ParentTest() { 
     System.out.println("父类—无参构造函数"); 
   } 
 } 
   
 public class Test extends ParentTest { 
   public static String STATIC_FIELD = "静态属性"; 
   
   // 静态块 
   static { 
     System.out.println(STATIC_FIELD); 
     System.out.println("静态代码块"); 
   } 
   
   public String field = "非静态属性"; 
   
   // 非静态块 
   { 
     System.out.println(field); 
     System.out.println("非静态代码块"); 
   } 
   
   public Test() { 
     System.out.println("无参构造函数"); 
   } 
   
   public static void main(String[] args) { 
     Test test = new Test(); 
   } 
 } 

执行结果如下:

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

可以看到,静态代码块只在类加载时执行一次,在main方法之前执行。实例代码块在每次创建对象时执行,然后再执行构造方法。

注意,代码块的执行顺序是固定的,无论创建多少个对象,都会按照上述顺序执行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论
  • 验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档