java的初始化块可以算作类中继属性、方法、内部类的第4类成员。主要用于完成属性的初始化。
而属性的初始化主要分成3个阶段
- 调用构造函数前
- 调用构造函数时
- 调用构造函数后
2,3两点很好理解,基本上就是在构造对象的过程中对对象的属性进行初始化,或者在对象构造完成后,通过set方法进行修改。
其实,第一个阶段有分为3个子阶段
默认的初始化
class Student{
private int id;
private String name;
public Student() {
super();
System.out.println("--->无参构造器");
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
System.out.println("--->有参构造器");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
}
//默认的初始化
@Test
public void test1(){
Student s = new Student();
System.out.println(s);
}
则结果如下:
显示的初始化方式
其他地方不变,类属性后直接进行初始化
private int id = 1;
private String name = "wanghao";
结果如下:
代码块初始化
其他地方不变,属性和方法之间增加代码块
<span style="white-space:pre"> </span>private int id = 1;
private String name = "wanghao";
{
id = 3;
name = "lalala";
System.out.println("--->代码块1");
}
{
id = 4;
name = "吼吼";
System.out.println("--->代码块2");
}
代码块需要注意如下几点:
- 初始化代码块的执行是先于构造器的
- 属性默认、显示的初始化顺序要依据两者书写的顺序,一般情况下都是属性写在前
- 多个初始化块之间按顺序执行
则结果如下
静态代码块
- 里面可以有输出语句
- 随着类的加载而加载,而且只被加载一次
- 多个静态代码块之间按照顺序结构执行
- 静态代码块的执行要早于非静态代码块的执行。
- 静态的代码块中只能执行静态的结构(类属性,类方法)
static{
System.out.println("--->静态代码块1");
}
{
id = 3;
name = "lalala";
System.out.println("--->代码块1");
}
{
id = 4;
name = "吼吼";
System.out.println("--->代码块2");
}
结果如下