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

Posted veonwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. 非静态初始化块可以针对多个重载构造函数进行代码复用

 

 

 

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

以上是关于Java:初始化块静态初始化块构造方法的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

一文详解:Java中父子类静态块构造块构造方法成员变量之间的初始化先后顺序与执行先后顺序

java中的静态代码块、代码块、构造器的执行顺序是怎样呢,这三者有啥作用呢

静态代码块构造代码块构造函数以及Java类初始化顺序

Java初始化顺序(静态变量静态初始化块实例变量实例初始化块构造方法)

java类的初始化块/执行顺序,实例化对象数据赋值

Java类的静态成员静态代码块普通成员普通代码块构造方法初始化执行的顺序