剑指offer-Java类加载过程

Java 类加载过程:(以A.class为例)

1. 定位A.class类,并调用findLoaderClass(string)判断这个类是否已经存在

2. 先执行父类中static成员变量与static方法块

3. 再执行子类中static成员变量与static方法块

4. 接着执行父类中非static成员变量、非static方法块和构造函数

5. 最后执行子类中非static成员变量、非static方法块和构造函数

注意:构造函数是最后执行的。

下面用测试过的代码输入来说明:

(1)类中没有成员变量时

 1 public class Test1 {    
 2     static{
 3         System.out.println(5);
 4     }
 5     
 6     public Test1() {
 7         System.out.println(6);
 8     }
 9     {
10         System.out.println(7);
11     }
12 }
13 
14 public class Test extends Test1 {    
15     static{
16         System.out.println(1);
17     }
18     {
19         System.out.println(2);
20     }    
21     public Test() {
22         System.out.println(3);
23     }
24     {
25         System.out.println(4);
26     }    
27     public static void main(String[] args) {
28         Test test=new Test();
29     }
30 }

输出:5 1 7 6 2 4 3

(2)有其他实例化对象时

 1 public class Test1 {    
 2     static Test2 test22=new Test2("static_father_test2");
 3     Test2 test2=new Test2("father_test2");    
 4     static{
 5         System.out.println(5);
 6     }
 7     
 8     public Test1() {
 9         System.out.println(6);
10     }
11     {
12         System.out.println(7);
13     }
14 }
15 
16 public class Test2 {
17     public Test2(String str) {
18         System.out.println("test2:"+str);
19     }
20 }
21 public class Test extends Test1 {    
22     static Test2 test22=new Test2("static_test22");    
23     Test2 test2=new Test2("test2");    
24     static{
25         System.out.println(1);
26     }
27     {
28         System.out.println(2);
29     }
30     
31     public Test() {
32         System.out.println(3);
33     }
34     {
35         System.out.println(4);
36     }    
37     public static void main(String[] args) {
38         Test test=new Test();
39     }
40 }

输出打印:
test2:static_father_test2
5
test2:static_test22
1
test2:father_test2
7
6
test2:test2
2
4
3

原文地址:https://www.cnblogs.com/GranceWang2014/p/4631179.html