一
先看一段代码,包含了构造函数、构造代码块、成员变量的显初始化。会输出什么呢?
class Test{
//构造函数
public Test(){
i = 300;
}
//构造代码块
{
i = 200;
}
//成员变量的显初始化
int i = 100;
public static void main(String[] args)
{
Test test = new Test();
System.out.println("i = "+test.i);
}
}
答案是 i = 300
二
执行反编译
看到构造代码块会被java编译器放在构造函数里面,成员变量的显初始化也会被放在构造函数里面。而构造函数的中代码是最后执行的。
三
修改源代码
class Test{
//构造代码块
{
i = 200;
}
//成员变量的显初始化
int i = 100;
public static void main(String[] args)
{
Test test = new Test();
System.out.println("i = "+test.i);
}
}
这时候输出的结果是 i = 100
再修改源代码
class Test{
//成员变量的显初始化
int i = 100;
//构造代码块
{
i = 200;
}
public static void main(String[] args)
{
Test test = new Test();
System.out.println("i = "+test.i);
}
}
这时候输出的结果是 i = 200
总结
- java编译器编译后,构造代码块会被移动到构造函数中执行,是在构造函数之前执行。
- 成员变量的显示初始化也会被移动构造函数中执行,也是在构造函数之前执行。
- 构造函数的中代码是最后执行的。
- 构造代码块与成员变量的显示初始化是按照当前代码的顺序执行。