1、分析:
1.1、在JVM类加载机制中,有讲到:将类加载到JVM当中后,才进行类的初始化。所谓初始化阶段,是指:根据程序员写的代码去初始化类变量和其他资源,这句话也可以这么说:初始化阶段是执行类构造器
301dd3c69c9b3e9c.jpg" alt="">
1.2、调用完
2、验证代码:
public class Main {
//实例化<a href="/tag/daima/" target="_blank" class="keywords">代码</a>块.每次<a href="/tag/shengcheng/" target="_blank" class="keywords">生成</a>类实例,都会执行.并且,实例化<a href="/tag/daima/" target="_blank" class="keywords">代码</a>块的执行 优先于 构造器.
{
System.out.println("blockA");
}
//静态语句块,在类初始化时,仅仅执行一次.
static{
System.out.println("blockB");
}
//类实例
public static Main t1 = new Main();
//构造器<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>
Main(){
System.out.println("constructor");
}
public static void main(String[] args)
{
//类实例
Main t2 = new Main();
}
}
输出结果:
Process finished with exit code 0
3、说明:
3.1、名字上的区分
3.2、说一下
3.2.1、
public class Main {
static int a=0;
static{
System.out.println("blockB");
System.out.println(a);
//System.out.println(b); //报错:Illegal forward reference
b=3;
}
static int b=1;
public static void main(String[] args)
{
//类实例
Main t2 = new Main();
System.out.println("b:"+b);
System.out.println("a:"+a);
}
}
运行结果:
<code class="language-java">blockB
0
b:1
a:0
3.2.2、
3.2.3、由于父类的
3.2.4、
3.2.5、接口中不能使用静态语句块,但仍然有变量初始化的赋值操作。因此接口和类一样都会生成
3.2.6、虚拟机会保证一个类的
注:需要注意的是,其他线程虽然会被阻塞,但如果执行