Java中代码的加载顺序所能了解的知识点
类的依赖关系
static代码块的加载时间
继承类中构造器的隐式调用
非static的成员变量初始化时间
main方法和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
|
public class App { private static App d = new App(); private SubClass t = new SubClass(); static { System.out.println( "App static" ); //6 } public App(){ System.out.println( "构建App" ); //5 } public static void main(String[] args) { System.out.println( "App main" ); //7 } } //父类 class SuperClass{ static { System.out.println( "SuperClass static" ); //1 } SuperClass(){ System.out.println( "构建SuperClass" ); //3 } } //子类 class SubClass extends SuperClass{ static { System.out.println( "SubClass static" ); //2 } public SubClass(){ //super() System.out.println( "构建SubClass" ); //4 } } |
输出结果
1
2
3
4
5
6
7
|
SuperClass static SubClass static 构建SuperClass 构建SubClass 构建App App static App main |
分析
因为在App类中,声明了SubClass的变量,所以JVM先加载SubClass类,不然无法编译App。
SubClass是SuperClass的子类,在继承关系的类中,父类先加载进JVM,不然子类无法编译。
在类中static代码会在字节码文件加载进JVM的时候调用一次,且在该类的生命周期中只会调用一次。所以在第一行输出的是SuperClass static,随后SubClass加载进了JVM,输出第二行的SubClass static
声明的static成员变量,其初始化是在static代码块中。非static成员变量,其初始化是在构造器中,且是在构造器的代码前面。
创建静态的成员变量d之前会先创建成员变量t,在SubClass的构造器中会隐式的使用super()调父类的构造器,所以第三行输出构建SuperClass,第四行输出SubClass。
在App的构造器中创建好了成员变量t后,向下执行,输出第五行的构建App
。
随后继续执行App的静态代码块(因为d是static的变量,所以并不是说App的构造器比static先执行),输出第六行的App static
。
最后执行public类的入口方法main,输出第七行的App main
。
希望本篇文章对您有所帮助
原文链接:http://blog.csdn.net/situliang/article/details/70249328