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

猜你喜欢

转载自www.cnblogs.com/fqfanqi/p/11830941.html