Java静态代码块,构造代码块,构造函数

1、介绍

①、构造函数

1
2
3
pubic HelloWorld(){

}

说明

  • 对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的。
  • 构造函数的作用是用于给对象进行初始化。
  • 一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。

②、构造代码块

1
2
3
{
// 构造代码块
}

说明

  • 对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的
  • 构造函数的作用是用于给对象进行初始化
  • 一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次

③、静态代码块

1
2
3
static {
// 静态代码块
}

说明

  • 它是随着类的加载而执行,只执行一次,并优先于主函数。具体说,静态代码块是由类调用的。类调用时,先执行静态代码块,然后才执行主函数的
  • 静态代码块其实就是给类初始化的,而构造代码块是给对象初始化的
  • 静态代码块中的变量是局部变量,与普通函数中的局部变量性质没有区别。
  • 一个类中可以有多个静态代码块

2、三者执行顺序

1、静态代码块,静态,其作用级别为类,构造代码块、构造函数,构造,其作用级别为对象。

  • 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。
  • 构造代码块,每创建一个对象时就会执行一次,且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。
  • 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。

    三者的执行顺序应该为:静态代码块 > main() > 构造代码块 > 构造函数

3、代码示例

①、普通类初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class HelloWorld {

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

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

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

public static void main(String[] args) {
HelloWorld A = new HelloWorld();
System.out.println("*******************");
HelloWorld B = new HelloWorld();
}
}

执行结果

1
2
3
4
5
6
7
静态代码块
--------------------
普通代码块......
helloWorld 构造函数.....
*******************
普通代码块......
helloWorld 构造函数.....

②、继承体系初始化

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
public class HelloWorld {

public static String name = "父类:HelloWorld——>静态变量";

public HelloWorld() {
System.out.println("父类:HelloWorld——>构造函数.....");
}

{
System.out.println("父类:HelloWorld——>普通代码块......");

}

static {
System.out.println(name);
System.out.println("父类:HelloWorld——>静态代码块");

}

}

public class ChildHelloWorld extends HelloWorld {

private static String childName = "子类:ChildHelloWord——>静态变量";

public ChildHelloWorld() {
System.out.println("子类:ChildHelloWorld——>构造函数.....");
}

{
System.out.println("子类:ChildHelloWorld——>普通代码块......");
}

static {
System.out.println(childName);
System.out.println("子类:ChildHelloWorld——>静态代码块......");
}

public static void main(String[] args) {

System.out.println("子类:main()方法.....");

new ChildHelloWorld();

}
}

执行结果

1
2
3
4
5
6
7
8
9
父类:HelloWorld——>静态变量
父类:HelloWorld——>静态代码块
子类:ChildHelloWord——>静态变量
子类:ChildHelloWorld——>静态代码块......
子类:main()方法.....
父类:HelloWorld——>普通代码块......
父类:HelloWorld——>构造函数.....
子类:ChildHelloWorld——>普通代码块......
子类:ChildHelloWorld——>构造函数.....

Java 初始化顺序图