概述:
属性、方法、构造方法和自由块都是类中的成员,在创建类的对象时,类中各成员的执行顺序:
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方法。