java子类加载顺序(转载)


1 class Grandpa{ 2 public static String p_StaticField = "祖父类--静态变量"; 3 public String p_Field = "祖父类--变量"; 4 5 static { 6 System.out.println(p_StaticField); 7 System.out.println("祖父类--静态初始化块"); 8 } 9 10 { 11 System.out.println(p_Field); 12 System.out.println("祖父类--初始化块"); 13 } 14 15 public Grandpa() { 16 System.out.println("祖父类--构造器"); 17 } 18 } 19 20 class Parent extends Grandpa{ 21 22 public static String p_StaticField = "父类--静态变量"; 23 24 public String p_Field = "父类--变量"; 25 26 static { 27 System.out.println(p_StaticField); 28 System.out.println("父类--静态初始化块"); 29 } 30 31 { 32 System.out.println(p_Field); 33 System.out.println("父类--初始化块"); 34 } 35 36 public Parent() { 37 System.out.println("父类--构造器"); 38 } 39 } 40 public class SubClass extends Parent { 41 42 public static String s_StaticField = "子类--静态变量"; 43 44 public String s_Field = "子类--变量"; 45 46 static { 47 System.out.println(s_StaticField); 48 System.out.println("子类--静态初始化块"); 49 } 50 51 { 52 System.out.println(s_Field); 53 System.out.println("子类--初始化块"); 54 } 55 56 public SubClass() { 57 58 System.out.println("子类--构造器"); 59 } 60 61 public static void main(String[] args) { 62 System.out.println("*************in main***************"); 63 new SubClass(); 64 System.out.println("*************second subClass***************"); 65 new SubClass(); 66 } 67 }

 

运行结果:

祖父类--静态变量
祖父类--静态初始化块
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
*************in main***************
祖父类--变量
祖父类--初始化块
祖父类--构造器
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
*************second subClass***************
祖父类--变量
祖父类--初始化块
祖父类--构造器
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器

 

加载顺序:(父类静态成员、静态代码块—>子类静态成员、静态代码块—>父类实例成员、代码块——>父类构造函数—>子类实例成员、代码块—>子类构造函数)

 

 

在加载子类时,如果继承于父类,上溯加载,如果父类之上还有父类,再上溯。最后从祖父类依次加载到子类。

先加载静态变量,再静态初始化块。

在实例对象后先加载变量,再初始化,然后调用构造方法。

 

posted on 2014-07-27 15:06  Arvin-9  阅读(309)  评论(0)    收藏  举报

导航