静态代码块,非静态代码块,构造器的执行顺序和次数
View Code
1 package com.Test; 2 3 public class Test1 { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 // TODO Auto-generated method stub 10 System.out.println("------------------第一次实例化对象--------------------"); 11 Parent parent = new Child(); 12 System.out.println("——————————————————第二次实例化对象————————————————————"); 13 parent=new Child(); 14 } 15 } 16 17 class Parent { 18 public static StaticVarible staticVarible = new StaticVarible("父类-静态变量1"); 19 public StaticVarible instVarible = new StaticVarible("父类-成员变量1"); 20 21 static { 22 System.out.println("父类-静态块"); 23 } 24 25 { 26 System.out.println("父类-初始化块"); 27 } 28 29 public Parent() { 30 System.out.println("父类-实例构造函数"); 31 } 32 } 33 34 class Child extends Parent { 35 public static StaticVarible staticVarible = new StaticVarible("子类-静态变量1"); 36 public StaticVarible instVarible = new StaticVarible("子类-成员变量1"); 37 38 static { 39 System.out.println("子类-静态块"); 40 } 41 42 public Child() { 43 System.out.println("子类-实例构造函数"); 44 } 45 46 { 47 System.out.println("子类-初始化块"); 48 } 49 50 } 51 52 class StaticVarible { 53 public StaticVarible(String info) { 54 System.out.println(info); 55 } 56 }
第一次实例化对象
父类-静态变量1
父类-静态块
子类-静态变量1
子类-静态块
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数
——————————————————第二次实例化对象————————————————————
父类-成员变量1
父类-初始化块
父类-实例构造函数
子类-成员变量1
子类-初始化块
子类-实例构造函数
结论:
从上述结果可以看出,在实例化一个对象时,各部分的加载顺序如下:
父类静态成员/父类静态初始化块 -> 子类静态成员/子类初始化块 -> 父类成员变量/父类初始化块 -> 父类构造函数 -> 子类成员变量/子类初始化块 -> 子类构造函数
静态代码块和静态成员只有类首次加载进内存时调用一次,只此一次。
非静态代码块和成员,每次创建对象时,会在构造函数之前被调用。
构造函数,每次创建对象时,最后调用。
创建子类对象时,先创建父类对象,再创建子类对象。