主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序。 如有错误,欢迎指出。
静态成员变量和静态代码块的优先级是一样的,先定义的先执行。 在创建一个对象的时候会执行非静态代码块和构造函数
/* * *(1)父类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 * *(2)子类静态成员和静态初始化块,按在代码中出现的顺序依次执行。 * *(3)父类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 * *(4)执行父类构造方法。 * *(5)子类实例成员和实例初始化块,按在代码中出现的顺序依次执行。 * *(6)执行子类构造方法。 * */
public class StaticTest {
public static StaticTest t1=new StaticTest(); //静态成员变量,第一步执行
public static void main(String args[]) {
StaticTest t2=new StaticTest(); //第三步执行
}
//静态代码块
static{
System.out.println("B");//第二步执行
}
//非静态代码块
{
System.out.println("A");
}
}
输出:
A B A
再来看看这个代码,代码位置调换一下顺序
public class StaticTest {
public static void main(String args[]) {
StaticTest t2=new StaticTest(); //第三步执行
}
//静态代码块
static{
System.out.println("B");//变成第一步执行
}
public static StaticTest t1=new StaticTest(); //静态成员变量,变成第二步执行
//非静态代码块
{
System.out.println("A");
}
}
输出:
B A A
所以验证: 1.静态成员变量和静态代码块的优先级是一样的,先定义的先执行。 2.在创建一个对象的时候会执行非静态代码块和构造函数。