为什么下面两段代码中静态代码块、构造代码块和构造函数的执行顺序完全不一样呢?
public class test3 {
public static test3 t1=new test3();
public test3(){
System.out.println("A");
}
{
System.out.println("B");
}
static
{
System.out.println("C");
}
public static void main(String [] args){
//test3 t2=new test3();
}
}
public class test3 {
//public static test3 t1=new test3();
public test3(){
System.out.println("A");
}
{
System.out.println("B");
}
static
{
System.out.println("C");
}
public static void main(String [] args){
test3 t2=new test3();
}
}
总体来说
1.静态成员跟随类一起加载且只加载一遍,普通成员在创建对象时执行,所以静态的优先于普通的,无论是变量还是方法块
2.同类看书写先后顺序
3.构造代码块优先于构造方法执行(如果你反编译class文件可以发现构造代码块是被合并到构造方法里并位于最前面的)
所以第一个大致顺序如下
1.JVM加载类,同时存在静态变量和静态代码块,但静态变量 t1写在前面优先执行,即执行创建新对象操作
2.创建新对象,存在构造代码块,执行,打印 B
3.执行构造方法,打印 A
4.静态变量赋值操作完成,执行静态代码块,打印 C
第二个大致顺序如下
1.加载类,存在静态代码块,执行,打印 C
2.执行main方法,创建新对象,存在构造代码块,执行,打印 B
3.执行构造方法,执行,打印 A