作用

用来初始化类或对象信息。代码块只能使用 static 修饰

分类

  • 静态代码块:使用static修饰
  • 非静态代码块:没有使用static修饰

静态代码块

  • 随着类的加载而执行
  • 由于类的加载只会执行一次,进而静态代码块的执行,也只会执行一次
  • 作用:用来初始化类的信息
  • 内部可以声明变量、调用属性或方法、编写输出语句等操作
  • 静态代码块的执行要先于非静态代码块的执行
  • 如果声明有多个静态代码块,则按照声明的先后顺序执行
  • 静态代码块内部只能调用静态的结构(即静态的属性、方法),不能调用非静态的结构(即非静态的属性、方法)

非静态代码块

  • 随着对象的创建而执行
  • 每创建当前类的一个实例,就会执行一次非静态代码块
  • 作用:用来初始化对象的信息
  • 内部可以声明变量、调用属性或方法、编写输出语句等操作
  • 如果声明有多个非静态代码块,则按照声明的先后顺序执行
  • 非静态代码块内部可以调用静态的结构(即静态的属性、方法),也可以调用非静态的结构(即非静态的属性、方法)

代码块示例

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
55
56
57
58
59
60
61
62
63
package com.base.learn;

public class BlockTest {
public static void main(String[] args) {
String desc = Person.desc;
System.out.println("---------");
Person p1 = new Person();
}
}

class Person {
// 属性
String name;
int age;
static String desc = "人类";

// 构造器
public Person() {

}

public Person(String name, int age) {
this.name = name;
this.age = age;
}

// 代码块
static {
System.out.println("Hello, Static Block-1");
desc = "hello,";
}

static {
System.out.println("Hello, Static Block-2");
}

{
System.out.println("Hello, Block");
desc = "heihei";
eat();
}

// 方法
public void eat() {
System.out.println("吃饭");
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

/*
Hello, Static Block-1
Hello, Static Block-2
---------
Hello, Block
吃饭
*/

代码块的执行顺序

通过下面这两段代码,搞清楚代码块的执行顺序

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package com.base.learn;

/**
* 判断加载顺序
* 由父及子,静态先行
*/

class Root {
static {
System.out.println("Root 的静态代码块");
}

{
System.out.println("Root 的普通代码块");
}

public Root() {
System.out.println("Root 空参构造器");
}
}

class Mid extends Root {
static {
System.out.println("Mid 的静态代码块");
}

{
System.out.println("Mid 的普通代码块");
}

public Mid() {
System.out.println("Mid 空参构造器");
}

public Mid(String msg) {
this();
System.out.println("Mid 带参构造器 " + msg);
}
}

class Leaf extends Mid {
static {
System.out.println("Leaf 的静态代码块");
}

{
System.out.println("Leaf 的普通代码块");
}

public Leaf() {
super("天天向上");
System.out.println("Leaf 空参构造器");
}
}


public class LeafTest {
public static void main(String[] args) {
new Leaf();
System.out.println("--------------");
new Leaf();
}
}
/*
Root 的静态代码块
Mid 的静态代码块
Leaf 的静态代码块
Root 的普通代码块
Root 空参构造器
Mid 的普通代码块
Mid 空参构造器
Mid 带参构造器 天天向上
Leaf 的普通代码块
Leaf 空参构造器
--------------
Root 的普通代码块
Root 空参构造器
Mid 的普通代码块
Mid 空参构造器
Mid 带参构造器 天天向上
Leaf 的普通代码块
Leaf 空参构造器
*/

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
package com.base.learn;

class Father {
static {
System.out.println("111111111");
}

{
System.out.println("222222222");
}

public Father() {
System.out.println("333333333");
}
}

public class SonTest extends Father {
static {
System.out.println("444444444");
}

{
System.out.println("555555555");
}

public SonTest() {
System.out.println("666666666");
}

public static void main(String[] args) {
System.out.println("777777777");
System.out.println("******************");
new SonTest();

}
}
/*
111111111
444444444
777777777
******************
222222222
333333333
555555555
666666666
*/

变量赋值初始化过程

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
package com.base.learn;

/**
* 对属性可以赋值的位置:
* 1. 默认初始化
* 2. 显示初始化
* 3. 构造器中初始化
* 4. 有了对象以后,可以通过"对象.属性" 或 "对象.方法"的方式进行赋值
* 5. 在代码块中赋值
*
* 执行先后顺序:1 -- 2 / 5 -- 3 -- 4
*/
public class Order1 {
public static void main(String[] args) {
Ord ord = new Ord();
System.out.println(ord.orderId);
}
}

class Ord {
{
orderId = 4;
}
int orderId = 3;
}