在java类中,各个代码块执行顺序如下:
(1) 父类静态对象和静态代码块
(2) 子类静态对象和静态代码块
(3) 父类非静态对象和非静态代码块
(4) 父类构造函数
(5) 子类 非静态对象和非静态代码块
(6) 子类构造函数
在同一类中,执行顺序的优先级为:静态块>main()>构造块>构造方法
其中:(1)静态块:用static申明,JVM加载类时执行,仅执行一次
(2)构造块:类中直接用{}定义,每一次创建对象时执行注:类中静态块按照声明顺序执行
案例:
public class Test
{
public static Test t1 = new Test();
{
System.out.println("blockA");
}
static
{
System.out.println("blockB");
}
public static void main(String[] args)
{
Test t2 = new Test();
}
}
解析:
由于类中静态块按照声明顺序执行,因此上述代码中,整体的执行顺序为:
(1)首先执行:public static Test t1 = new Test();
(2)之后执行:static { System.out.println("blockB"); }
(3)最后执行:public static void main(String[] args) {Test t2 =new Test();}
在执行(1)时,创建了一个Test对象,在这个过程中会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时就输出了blockA;然后执行(2)输出blockB;执行(3)的过程同样会执行非静态代码块和缺省的无参构造函数,在执行非静态代码块时输出blockA。因此,最终的结果为: