Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块

  静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值。

2. (非静态)初始化块

  (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值。

3. 构造方法

 

  构造方法在每次生成实例对象时都执行一次

4. 执行顺序:静态初始化块 ——> 初始化块 ——> 构造方法

测试代码如下:

 1 public class Son extends Father {
 2     static int sNum = 0;
 3     int num = 0;
 4     public static void main(String[] args){
 5         System.out.println("-----");
 6         new Father();
 7         System.out.println("-----");
 8         new Son();
 9         System.out.println("-----");
10         System.out.println("sNum = " + sNum);
11     }
12     
13     public Son() {
14         System.out.println("Son构造方法");
15     }
16     
17     static {
18         //num = 1;    //报错:无法为非静态变量赋值
19         sNum = 1;
20         System.out.println("Son静态初始化器");
21     }
22     
23     {
24         System.out.println("Son初始化块");
25     }
26     
27 }
28 
29 class Father {
30     {
31         System.out.println("Father初始化块");
32     }
33     
34     public Father() {
35         System.out.println("Father构造方法");
36     }
37     
38     static {
39         System.out.println("Father静态初始化器");
40     }
41 }
View Code

测试结果如下:

总结: 

  1. 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行;
  2. 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;
  3. 非静态始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;
  4. 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码
  5. 非静态初始化块可以针对多个重载构造函数进行代码复用

只执行一次,即类首次加载时。

猜你喜欢

转载自www.cnblogs.com/veonwang/p/9389938.html