剑指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