本帖最后由 阿里策 于 2013-9-26 21:35 编辑
创建对象时执行顺序应该是这样的(Car c = new Car;):(1)加载类,(2)执行类的静态成员变量和成员方法, (3)开辟对象的内存空间,(4)默认初始化对象的成员变量 (5)显示初始化对象的成员变量(如 int a = 2;这种成员变量赋值语句) (6)构造代码初始化对象的成员变量 (7)构造函数初始化对象的成员变量 (8)将对象的堆内存地址赋值给栈内存中的引用变量c; 并且这个过程中静态成员只执行一次。
对于该题,首先加载类,然后执行{1}静态成员变量private static StaticCode tt = new StaticCode(); 然后再执行{2}静态代码块 static{System.out.println("StaticCode类的静态代码块");}。这里执行{1}时,生成一个StaticCode的对象,按理说应该先加载StaticCode类,再执行静态成员变量和方法,但是类前面已经加载过了,静态成员变量前面也已经执行过了,所以不需要重复,接着就是执行默认初始化对象的成员变量,赋值为空。然后执行显示初始化对象的成员变量private InstanceCode In = new InstanceCode(); 这又创建一个对象,按照上述顺序就会出现InstanceCode的静态代码块,InstanceCode的构造代码块,InstanceCode的构造函数。接着执行构造代码块初始化,打印StaticCode类的构造代码块;构造函数初始化,打印StaticCode类的构造函数;然后才执行{2}打印StaticCode类的静态代码块。接下来本该执行第一段中的(4)(5)(6)(7)步骤,但是这些在执行{1}时就已经执行过了,而且他们这些初始化动作只执行一次,所以不会重复执行。 你这个例子正好印证了我的另一个关于类加载执行顺序的答案!
但是我同时还有一个疑问:在执行{1}时,我觉得应该先执行StaticCode类的静态代码段的,就是应该第一个打印StaticCode类的静态代码块。但是实际的运行时却不是,而是跳过了,不知道怎么回事。。
|