Java面试--类加载顺序
类什么时候就行初始化:
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName(“com.fanqi.load.Child”))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
类的初始化顺序:
1)如果这个类还没有被加载和链接,那先进行加载和链接
2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。
4)总的来说,初始化顺序依次是:父类的静态变量、静态初始化块 --> 子类的静态变量、静态初始化块 --> 父类的非静态初始化块 --> 父类构造方法 --> 子类的非静态初始化块 --> 子类的构造方法
1 package com.qa.xgold.auto.model; 2 3 public class Parent { 4 5 public static String result = parentStaticMethod2(); 6 7 private static String parentStaticMethod2() { 8 System.out.println("父类的静态方法2"); 9 return "I am parentStaticMethod2 !"; 10 } 11 12 { 13 System.out.println("父类的非静态初始化块!"); 14 } 15 16 static { 17 System.out.println("父类的静态初始化块!"); 18 } 19 20 public Parent(){ 21 System.out.println("父类的构造方法!"); 22 } 23 24 public static String parentStaticMethod1(){ 25 System.out.println("父类的静态方法1!"); 26 return "I am parentStaticMethod1 !"; 27 } 28 29 }
1 package com.qa.xgold.auto.model; 2 3 public class Child extends Parent { 4 5 { 6 System.out.println("子类非静态初始化块!"); 7 } 8 9 static { 10 System.out.println("子类静态初始化块!"); 11 } 12 13 public Child(){ 14 System.out.println("子类的构造方法!"); 15 } 16 17 public static String childStaticMethod(){ 18 System.out.println("子类的静态方法!"); 19 return ""; 20 } 21 22 public static void main(String[] args){ 23 new Child(); 24 } 25 26 } 27 28 29 // 执行结果 30 父类的静态方法2 31 父类的静态初始化块! 32 子类静态初始化块! 33 父类的非静态初始化块! 34 父类的构造方法! 35 子类非静态初始化块! 36 子类的构造方法! 37 38 Process finished with exit code 0