http://blog.csdn.net/macheng365/article/details/6403050
并不是首先调用其构造方法而是先是成员变量的初始化,而且成员的初始化的顺序以成员变量的定义顺序有关,先定义的先初始化,初始化后再调用构造方法。其实成员变量的初始化,在类的所有方法调用之前进行,包括构造方法。
static的成员比普通的成员变量先初始化。
public class Test04 ...{
private static Test04 t1 = new Test04();
private static int i1;
private static int i2 = 2;public Test04()...{
i1++;
i2++;
}public static void main(String[] args) ...{
Test04 t2 = new Test04();
System.out.println("t2.i1 = " + t2.i1);
System.out.println("t2.i2 = " + t2.i2);
}
}
我们先预计一下输出,可能有几种答案:2和3,3和3,2和2
执行代码后:
t2.i1 = 2
t2.i2 = 3
其实代码的执行顺序是这样的:首先执行给t1,i1,i2分别给予初始值null,0,0,再执行
Test04 t1 =new
Test04(),这样i1++,i2++被执行,i1,i2都变为1,执行完毕后接着执行int i1; i1,i2的值仍然是1,1,当执行int i2 =
2时i2被赋予了值,即i1 = 1,i2=2;再执行Test04 t2 = new Test04(),i1,i2再执行++,此时i1 =2,i2
=3,输出i1,i2,结果就是:t2.i1 = 2,t2.i2 = 3。
通过上面的代码我们可以认为系统默认值的给予比通过等号的赋予先执行。
当父类,和子类有Static时,先初始化父类Static,再初始化子类的Static,再初始化父类的其他成员变量->父类构造方法->子类其他成员变量->子类的构造方法。
父类上层还有父类时,总是先执行最顶层父类的Static-->派生类Static-->派生类Static-->.......-->子类Static-->顶层父类的其他成员变量-->父类构造方法-->
派生类的其他成员变量 --> 派生类构造方法-->
...............-->子类其他成员变量-->子类构造方法
下面需要说明的一点也是至关重要的一点:那就是成员变量的初始化和非static初始化块之间的执行顺序是按照他们出现的先后顺序来执行的