1 package static类型.执行顺序; 2 3 public class Test { 4 Person person = new Person("Test"); 5 static{ 6 System.out.println("test static");//1 7 } 8 9 public Test() { 10 System.out.println("test constructor");//5 11 } 12 13 public static void main(String[] args) { 14 new MyClass(); 15 } 16 } 17 18 class Person{ 19 static{ 20 System.out.println("person static");//3 21 } 22 public Person(String str) { 23 System.out.println("person "+str);//4//6 24 } 25 } 26 27 28 class MyClass extends Test { 29 Person person = new Person("MyClass"); 30 static{ 31 System.out.println("myclass static");//2 32 } 33 34 public MyClass() { 35 System.out.println("myclass constructor");//7 36 } 37 }
解释:
1.执行main方前会加载Test类,执行static 输出:test static
2.执行new MyClass() 先加载MyClass,但是发现继承Test,而Test已经加载过了不需要加载了,所以加载MyClass,执行static代码块,输出myclass static
3.1 加载完后MyClass要通过构造函数生成对象,但是要先初始化父类的成员变量,会执行Person person = new Person("Test");,于是要加载Person类,加载的时候执行static代码块,输出person static
3.2 然后在new Person,执行Person的构造函数,输出:person Test
4.再执行Test的构造函数,输出test constructor
5.1执行Person person = new Person("MyClass");,再次执行Person的构造函数,输出:person MyClass
5.2最后执行MyClass的构造函数,输出myclass constructor
注:针对3.2-4,5.1-5.2不论变量放在哪儿,都会先于任意一个方法的执行前执行,包括构造方法,而构造方法是一个类必须会执行的方法,不需要显示的进行调用。同时,不论变量在哪儿分布,只要在方法外部,就一定先于方法初始化。