在Java中会经常用到静态代码块和构造方法,但是还有一种代码块叫构造代码块,用的比较少,但是在面试时会因为代码块执行顺序而提到。
静态代码块,只在类加载时执行一次,多个静态代码块执行顺序取决于它在代码中的位置,先定义的先执行,最常用的场景就是加载native库
static {
System.loadLibrary("zhixing");
}
构造代码块,每次创建实例时都会执行,多个构造代码块执行顺序也取决于它在代码中的位置,先定义的先执行,它和构造方法执行时机不同的是,如果有多个构造方法,创建实例时只会调用其中一个构造方法,而构造代码块始终都会调用。不过我们可以在构造方法里面调用另外一个构造方法,或者调用统一的初始化方法,来实现构造代码块的功能,而且更加直观。
首先明确一点,静态代码块是在类加载时执行的,而构造方法和构造代码块是在创建实例时才执行,所以静态代码块肯定比后两者先执行,下面看看示例。
1class Course {
2
3 static {
4 System.out.println("静态代码块");
5 }
6
7 public Course() {
8 System.out.println("构造方法1");
9 }
10
11 public Course(int test) {
12 System.out.println("构造方法2");
13 }
14
15 {
16 System.out.println("构造代码块");
17 }
18}
19
20public class Main {
21
22 public static void main(String[] args) {
23 Course course = new Course();
24 System.out.println("========");
25 course = new Course(1);
26 }
27}
1class BaseModel {
2 static {
3 System.out.println("BaseModel静态代码块");
4 }
5
6 public BaseModel() {
7 System.out.println("BaseModel构造方法");
8 }
9
10 {
11 System.out.println("BaseModel构造代码块");
12 }
13}
14
15class Course extends BaseModel {
16
17 static {
18 System.out.println("Course静态代码块");
19 }
20
21 public Course() {
22 System.out.println("Course构造方法");
23 }
24
25 {
26 System.out.println("Course构造代码块");
27 }
28}
29
30public class Main {
31
32 public static void main(String[] args) {
33 Course course = new Course();
34 }
35}