目录
实例域代码块
静态域代码块
初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以有多个代码块。
实例域代码块
使用方法
-
可以有输出语句
-
可以对类的属性、类的声明进行初始化操作
-
对集合中属性进行填充
-
可以调用静态的方法或者变量
-
若有多个非静态代码块,执行顺序为从上到下的顺序依次执行
-
每次创建对象的时候,都会执行依次
public class ClassD {int a;static String str="数据3";static void print(){System.out.println("静态方法执行了");}List list=new ArrayList();{int a=10;list.add("数据1");list.add("数据2");list.add(str);print();System.out.println("实例域代码块执行了");}public ClassD() {System.out.println("构造方法");}public static void main(String[] args) {ClassD classD=new ClassD();System.out.println(classD.list.toString());}
}
运行结果:
这里有个问题,就是我们可以看出实例域代码块比构造方法先执行了,但真的是这样吗?对象在初始化的时候会先调用构造方法,这是毫无疑问的,那为什么会出现上面的结果呢?看下面这段代码
public class A {A() {System.out.println("构造方法");}{System.out.println("实例域代码块");}public static void main(String[] args) {A a=new A();}
}
执行结果:
实际上在进行构造方法时会将代码初始化块放到了构造方法中
public class A {A() {{ System.out.println("实例域代码块"); }System.out.println("构造方法");} }
静态域代码块
静态代码块通常用来初始化一些静态变量,它会优先于 main()
方法和实例化代码块执行。
public class staticBlock {{System.out.println("实例代码块执行了");}static{System.out.println("静态代码块执行了");}public static void main(String[] args) {System.out.println("执行main了");}}
运行结果:
再看下面这段代码
public class staticBlock {{System.out.println("实例代码块执行了");}static{System.out.println("静态代码块执行了");}public static void main(String[] args) {staticBlock staticBlock1=new staticBlock();staticBlock staticBlock2=new staticBlock();System.out.println("执行main了");}}
运行结果:
然后再看这段示例:
public class staticBlock {{System.out.println("实例代码块执行了");}static{System.out.println("静态代码块执行了");}public static void main(String[] args) {System.out.println("执行main了");}}
运行结果:
可以看出静态域代码块是在类加载过程中执行,只会执行一次,而实例域代码块是在类实例化时才会执行,每次创建实例对象都会执行一次 。因此,在实际开发之中,可以通过静态代码块来加载一些配置文件。