0%

静态块与构造块

前言:最近在面试题或者面试上老是提到静态块、构造块等执行顺序,这里总结一下

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* @author shency
* @description: TODO
*/
public class Main {
public static void main(String[] args) {
B b = new B();
b = new B();
}
}

class A {
static {
System.out.println("静态构造块 A1");
}

static {
System.out.println("静态构造块 A2");
}

{
System.out.println("构造块 A1");
}

{
System.out.println("构造块 A2");
}

public A() {
System.out.println("构造函数 A");
}
}

class B extends A {
static {
System.out.println("静态构造块 B1");
}

static {
System.out.println("静态构造块 B2");
}

{
System.out.println("构造块 B1");
}

{
System.out.println("构造块 B2");
}

public B() {
System.out.println("构造函数 B");
}
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
静态构造块 A1
静态构造块 A2
静态构造块 B1
静态构造块 B2
构造块 A1
构造块 A2
构造函数 A
构造块 B1
构造块 B2
构造函数 B
构造块 A1
构造块 A2
构造函数 A
构造块 B1
构造块 B2
构造函数 B

静态构造块:用static申明,JVM加载类时执行,仅执行一次

构造块:类中直接用{}定义,每一次创建对象时执行

静态块用于类初始化,构造块用于对象初始化。
静态代码块只会运行一次,一个类中可以有多个静态代码块,执行顺序按照位置决定。

执行顺序优先级:静态块>main()>构造块>构造方法

当设计继承时:

  1. 执行父类的静态代码块,并初始化父类静态成员变量
  2. 执行子类的静态代码块,并初始化子类静态成员变量
  3. 执行父类的构造代码块,执行父类的构造函数,并初始化父类普通成员变量
  4. 执行子类的构造代码块, 执行子类的构造函数,并初始化子类普通成员变量

变形

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* @author shency
* @description: TODO
*/
public class Main {
public static void main(String[] args) {
A a = new A();
a = new B();
}
}

class A {
static {
System.out.println("静态构造块 A1");
}

static {
System.out.println("静态构造块 A2");
}

{
System.out.println("构造块 A1");
}

{
System.out.println("构造块 A2");
}

public A() {
System.out.println("构造函数 A");
}
}

class B extends A {
static {
System.out.println("静态构造块 B1");
}

static {
System.out.println("静态构造块 B2");
}

{
System.out.println("构造块 B1");
}

{
System.out.println("构造块 B2");
}

public B() {
System.out.println("构造函数 B");
}
}

结果

1
2
3
4
5
6
7
8
9
10
11
12
13
静态构造块 A1
静态构造块 A2
构造块 A1
构造块 A2
构造函数 A
静态构造块 B1
静态构造块 B2
构造块 A1
构造块 A2
构造函数 A
构造块 B1
构造块 B2
构造函数 B
-------------本文结束感谢您的阅读-------------