[static]{
}
- 代码块相当于另一种形式的构造器(或者称为构造器的补充,有构造器的相同特征,
会被子类继承,是构造器的补充机制)。 - 静态代码块 => 类加载的时候就会调用,且只调用一次(随着类的加载而执行)。
类什么时候会被加载(重点理解)
- 创建对象实例时(new)
- 创建子类对象实例,父类也会被加载
- 使用类的静态成员时(静态属性,静态方法)
- 非静态代码块(普通代码块) => 类的实例化对象创建时会调用(每创建一个对象的时候就会调用)。
- 一般用于构造器重载时,构造器中代码冗余,可将冗余代码抽取出来,提高代码的复用性(并且无论使用哪一个构造器,代码块都会先被调用)。
- 构造器的补充:
class A{
public static int a = setA();
static {
System.out.println("A类的静态代码块被调用。");//(2)
}
{
System.out.println("A类的普通代码块被调用。");//(5)
}
public static int setA(){
System.out.println("A类的a静态变量初始化完成。");//(1)
return 1;
}
public A(){
//先执行静态代码块和静态变量的初始化
//这里其实会有super();只不过被隐式调用,不过由于A类的继承的是Object类。
//执行本类普通代码块和普通属性初始化。
System.out.println("A类的构造器被调用。");//(6)
}
}
class B extends A{
public static int b = setB();
static{
System.out.println("B类的静态代码块被调用。");//(4)
}
{
System.out.println("B类的普通代码块被调用。");//(7)
}
public static int setB(){
System.out.println("B类的a静态变量初始化完成。");//(3)
return 2;
}
public B(){
//先执行静态代码块和静态变量初始化
//这里其实会有super();只不过被隐式调用。
//执行本类普通代码块和普通属性初始化。
System.out.println("B类构造器被调用。");//(8)
}
}
当创建一个B类的实例化对象后代码的执行顺序已被标出。
注:本人只是一个在学习过程中摸爬滚打的小白,如果文中有错误或者补充欢迎各位指出。