类的加载时候的初始化顺序

在牛客网上刷题时,一直做错类的加载时初始化这些题,不懂静态方法什么时候执行,初始化代码块什么时候执行,构造方法什么执行,今天在这里谨记,下次要是再做错,我….

题型一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A{

static {
System.out.println("静态代码块");
}
public A(){
System.out.println("构造方法");
}
{
System.out.println("初始化块");
}

public static void main(String[] args) {
System.out.println("A的静态main方法");
new A();
}
}

输出执行顺序,执行结果

1
2
3
4
静态代码块
A的静态main方法
初始化块
构造方法

题型二

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
class A{

static {
System.out.println("父类静态代码块");
}
public A(){
System.out.println("父类构造方法");
}
{
System.out.println("父类初始化块");
}


}
public class B extends A{
static{
System.out.println("子类静态代码块");
}
public B(){
System.out.println("子类构造方法");
}
{
System.out.println("子类初始化块");
}
public static void main(String[] args){
new B();
}
}

输出执行过程,结果

1
2
3
4
5
6
父类静态代码块
子类静态代码块
父类初始化块
父类构造方法
子类初始化块
子类构造方法

总结

对于题型一,谨记:静态的修饰变量(static)总是先于构造方法和普通代码块执行。static中又有static静态变量,static静态初始化块,static静态方法,里面静态方法是最后执行的,所以题型一中先执行静态代码块再执行静态方法。(原因:用static修饰的地方在编译器编译时就已经开始执行)
对于题型二,谨记: 先执行父类的静态代码块,然后执行子类的静态代码块 ,因为在编译时就开始执行。接着调用main方法,里面开始new B,所以 执行父类的普通初始化块->父类的构造方法快->最后执行子类的普通初始化块->子类的构造块