我们在内存分析和this的本质中,了解到java代码在内存中的执行顺序和分布情况,那么现在我们再来看一下静态代码块的执行顺序。

首先,我们知道构造方法用于对象的初始化,而静态初始化块,用于类的初始化操作!在静态初始化块中不能直接访问非static成员,因为非static成员是从属与对象的,而静态初始化块是从属于类的,静态初始化块执行的时候,对象还没有生成。

下面我们用代码来见证一下

public class TestStatic1 {

private String no;
private static String name;
static{
System.out.println("执行静态代码块");
name = "林高禄";
printName();
}

{
System.out.println("执行非静态代码块");
name = "麦迪";
printName();
}

public static void printName(){
System.out.println(name);
}
public static void main(String[] args) {
TestStatic1 t = null;
System.out.println("-----------------");
TestStatic1 t2 = new TestStatic1();
}

}

结果

执行静态代码块
林高禄
-----------------
执行非静态代码块
麦迪

从输出的结果我们可以分析一下:


1、TestStatic1 t = null;

这里执行的时候,并没有生成对象,只是把类初始化带方法区,初始化类事,执行了静态代码块,而不执行非静态代码块,说明静态代码块是从属于类的,用于类的初始化操作,而非静态代码块不是。

2、System.out.println("-----------------");

输出分割线

3、TestStatic1 t2 = new TestStatic1();

在第一步中,已经初始化过类,这里又生成了一个对象,执行了非静态代码块,而不执行静态代码块,说明非静态代码块是从属于对象,这里从属于对象t2,而静态代码块不从属于对象,而是从属于类。