目录
实例域代码块
静态域代码块
初始化代码块分为静态域代码块和实例域代码块,静态域代码块在类第一次被加载时被执行,实例域代码块在创建对象时被执行,一个类中可以有多个代码块。
实例域代码块
使用方法
-
可以有输出语句
-
可以对类的属性、类的声明进行初始化操作
-
对集合中属性进行填充
-
可以调用静态的方法或者变量
-
若有多个非静态代码块,执行顺序为从上到下的顺序依次执行
-
每次创建对象的时候,都会执行依次
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了");
}
}
运行结果:
可以看出静态域代码块是在类加载过程中执行,只会执行一次,而实例域代码块是在类实例化时才会执行,每次创建实例对象都会执行一次 。因此,在实际开发之中,可以通过静态代码块来加载一些配置文件。