先上程序:
public class Hello {
public Hello(){
i=2000;//构造函数
}
int i=1000;//变量的声明和赋值
{
i=3000;//构造代码块
}
public static void main(String[] args) {
System.out.println(new Hello().i);
}
}
输出结果:2000
从程序的表面变量 i 并未遵守先声明再使用的原则(编译未报错),其实不然。程序编译之后通过使用javap反编译工具可以看到具体程序经过编译之后的样子。
使用命令:javap - c -l -private Hello
从上可以看出:
(1)在即使构造函数使用的变量在变量的声明之前,但是程序编译时还是会把声明提到构造函数的前面。
(2)可以看到无论是变量的赋值时候构造代码块最终都是在构造函数中执行的。并且构造函数的执行顺利放在了最后面(程序中构造函数是写在最前面的)。
当我们把构造函数注释掉,颠倒了构造代码块和变量声明的顺序,代码如下:
public class Hello {
/*
public Hello(){
i=2000;
}
*/
{
i=3000;
}
int i=1000;
public static void main(String[] args) {
System.out.println(new Hello().i);
}
}
程序输出:1000
,查看程序编译后的文件:
可以看出当我们把变量赋值和构造代码块的顺利颠倒后,在编译后的构造函数中顺利也是颠倒的,因此我们得到第三个点:
(3)编译后构造函数中的变量赋值和构造代码块中的顺序与初始程序中的顺序一致。(原先 的构造函数总是最后执行的)
综上。