属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序: 1.父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 2.子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 3. 父类的实例成员和实例初始化块,按在代码中出现的顺序依次执行。 4.执行父类的构造方法。 5.子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 6.执行子类的构造方法。
所以一个类的执行顺序总体可以分为三类:静态成员和静态初始化块,实例成员和实例初始化块,构造方法。
首先,先举几个简单的例子。 例一:main函数调用new AA();
public class AA { private static String s = print("静态成员变量"); private String s1 = "成员变量"; static { System.out.println("静态初始化块"); } { System.out.println("初始化块"); } public AA(){ System.out.println("无参构造函数"); } private static String print(String str){ System.out.println("静态方法块"); return str; } }结果:
静态方法块 静态初始化块 初始化块 无参构造函数例二:
main函数调用new son();
class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println("父类代码块初始化" ); } private static String s=print(); public static String print() { System. out.println("父类静态方法" ); return "父类静态成员变量的初始化" ; } public Father() { System. out.println("父类无参构造函数初始化完成" ); show(); } public void show() { System. out.println("父类show()方法" ); } } class Son extends Father { static{ System. out.println("子类静态代码块初始化" ); } { System. out.println("子类代码块初始化" ); } private static int i=1; private String s="子类私有成员变量" ; public void show() { System. out.println("子类show()方法:i=" +i); } public Son() { System. out.println("子类构造函数初始化完成" ); show(); } }结果:
父类静态代码块初始化 父类静态方法 子类静态代码块初始化 父类代码块初始化 父类无参构造函数初始化完成 子类show()方法:i=1 子类代码块初始化 子类构造函数初始化完成 子类成员变量初始化完成:s=子类私有成员变量 子类show()方法:i=1注意:父类的构造函数中show()实际调用的应该是子类的show方法。
