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 }
测试结果如下:
总结:
- 静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行;
- 非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;
- 非静态初始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;
- 静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码;
- 非静态初始化块可以针对多个重载构造函数进行代码复用。
只执行一次,即类首次加载时。
原文地址:https://www.cnblogs.com/veonwang/p/9389938.html
时间: 2024-09-30 00:06:49