构造代码块与静态代码块(静态初始化块)
1.构造代码块:每次创建对象时执行
2.静态代码块(静态初始化块):JVM加载类(加载在运行之前)时执行,静态代码块(静态初始化块)只执行一次
为啥需要静态初始化块?
静态初始化块主要用来初始化类变量
类变量可以在构造函数中初始化为啥还要定义静态初始化块呢?
因为,类变量可以通过类名.类变量的形式调用,有的时候我们不想为了初始化类变量而创建对象,所以就有了静态初始化块。
静态初始化块可以在类加载的时候执行一次。避免了了初始化类变量而创建对象
3.public static B t1 = new B()
;是类变量及引用(静态变量及静态引用)的初始化
4.执行顺序:类变量及引用(静态变量及静态引用)的初始化(默认初始化或“=”显示赋值)->静态代码块(静态初始化块,堆默认初始化的类变量根据需要重新初始化)->main()->实例变量及引用的初始化->构造代码块->构造方法
例:
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
输出如下:
构造块
构造块
静态块
构造块
原因
类变量及引用(静态变量及静态引用)的初始化(默认初始化或“=”显示赋值)优先于静态初始化块(静态块)执行,接下来静态初始化块(静态块)按照申明顺序执行,,
首先,执行public staticB t1 = newB();
该语句创建对象,则会调用构造代码块,输出第一个构造块
其次,执行public static B t2 = new B();
该语句又创建新对象,则又会调用构造代码块,输出第二个构造块
接着,再按照静态代码块申明顺序执行下面的静态代码块:输出静态块
static
{
System.out.println("静态块");
}
最后,main方法执行,创建对象,输出构造块
。