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

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

结论

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


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


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

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


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

 

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

1. 静态代码块:

    static { 
    } 


2. 非静态代码块


   {

   }

静态代码块:在类加载时执行,只执行一次。

非静态代码块:在创建对象时执行,每次创建对象都会执行一次。

构造方法:在创建对象时执行,每次创建对象都会执行一次。

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


   相同点:都是JVM加载类时且在构造函数执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。

   不同点:静态代码块在非静态代码块之前执行(静态代码块 > 非静态代码块)。静态代码块只在第一次new时执行一次,之后不再执行。而非静态代码块每new一次就执行一次。


 验证


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

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


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类实现继承后,执行顺序是否和我们的结论吻合。测试代码如下:


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方法之前执行。实例代码块在每次创建对象时执行,然后再执行构造方法。


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

相关文章
|
2月前
|
Java 程序员 数据库连接
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
本文详细介绍了Java中的初始化块,包括静态初始化块和非静态初始化块的概念、执行顺序和实际应用场景。通过具体示例,帮助读者理解这两种初始化块的区别和使用场景,让面试官对你刮目相看。
41 0
Java执行顺序大揭秘:静态块、非静态块和构造方法谁先谁后?
|
3月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
147 3
|
5月前
|
Java 程序员 API
从代码中寻找平衡:’java代码块和具体的代码应用
Java 8 引入的 Lambda 表达式是一项革命性特性,使编写简洁、灵活且易维护的代码成为可能。Lambda 表达式作为一种匿名函数,支持任意数量参数和返回值,其基本语法为 `(parameters) -> expression` 或 `(parameters) -> { statements; }`。
42 1
|
5月前
|
Java 数据安全/隐私保护
Java代码的执行顺序和构造方法
构造方法是类的一种特殊方法,用于初始化新对象。在 Java 中,每个类默认都有一个与类名同名的构造方法,无需返回类型。构造方法不能用 static、final、synchronized、abstract 或 native 修饰。它可以重载,通过不同的参数列表实现多种初始化方式。构造方法在对象实例化时自动调用,若未显式声明,默认提供一个无参构造方法。构造代码块和静态代码块分别用于对象和类的初始化,按特定顺序执行。
44 0
|
5月前
|
Java
【Java】代码块
【Java】代码块
|
7月前
|
Java
Java代码的执行顺序
Java代码的执行顺序
42 1
|
6月前
|
Java 编译器 数据库连接
Java面试题:什么是Java中的注解以及如何自定义注解?举例说明注解的经典用法
Java面试题:什么是Java中的注解以及如何自定义注解?举例说明注解的经典用法
126 0
|
6月前
|
存储 设计模式 Java
Java面试题:解释代理模式的概念,并举例说明其应用场景。
Java面试题:解释代理模式的概念,并举例说明其应用场景。
88 0
|
6月前
|
存储 安全 Java
Java面试题:Java内存模型中的主内存与工作内存是如何协同工作的?请解释Java内存模型中的可见性、原子性和有序性,举例说明Java内存模型中的happens-before关系
Java面试题:Java内存模型中的主内存与工作内存是如何协同工作的?请解释Java内存模型中的可见性、原子性和有序性,举例说明Java内存模型中的happens-before关系
53 0
|
7月前
|
Java
Java中代码块区别及代码示例
Java中代码块区别及代码示例
42 0