静态代码块、实例化代码块和构造函数
代码块
执行代码,如下:
public class People
{
public static int num = 0;//静态变量初始化
String name;//初始化为null
//构造函数
public People(String name) {
System.out.println(num + ":构造函数初始化");
this.name = name; //将name引用指向传入参数
num++; //构造函数执行结束num值+1
}
//实例初始化块
{
System.out.println(num + ":实例初始化块");
}
//静态初始化块
static {
System.out.println(num + ":静态初始化块");
}
public static void main(String[] args) {
People people = new People("jiangxiong");
People people2 = new People("jiangxiong");
}
}
输出内容:
0:静态初始化块
0:实例初始化块
0:构造函数初始化
1:实例初始化块
1:构造函数初始化
反编译后的代码:
public class People
{
public static int num = 0;
String name;
public People(String name)
{
System.out.println(num + ":实例初始化块");
System.out.println(num + ":构造函数初始化");
this.name = name;
num += 1;
}
public static void main(String[] args)
{
People people = new People("jiangxiong");
People people2 = new People("jiangxiong");
}
static
{
System.out.println(num + ":静态初始化块");
}
}
结论:
1)执行先后顺序,静态初始化块>实例初始化块>构造函数初始化。
2)静态初始化块只在类加载时执行一次,实例初始化块和构造函数初始化每次实例化类时都执行。
3)实例初始化块的代码,其实被放进了构造函数里面,且放在构造函数内容的前面。