本帖最后由 罗文杰 于 2012-6-3 23:44 编辑
占个楼号,这个比较绕,好好分析下,先写下结果。(1)(5)是静态的可以和(3)共存,(2)(4)绝对不能和(3)共存(或者说(2)(3)(4)不能共存)。
首先静态一定会先执行,那么执行的顺序是什么?
首先分析(1)和(5)的初始化过程,这两个是一样的,都是静态的。不管你运不运行(3),(1)和(5)都会先初始化。
首先(1)执行的时候去找父类,父类里面有静态的就先初始化,初始化完成后,子类里面的静态的就初始化,***但是这里要注意 ***,子类的静态代码块不执行,因为子类的静态代码块 放在(1),(5)的后面,这时(1),(5)被当成是一个静态变量去执行,所有的步骤都是在子类静态代码块之前来完成,但是你把子类的静态代码块放在(1),(5)之前,(1)会先在执行完父类的静态的初始化之后,去执行子类的静态代码块,但是(5)不会执行,因为静态代码块只执行一次!
静态的东西初始化完毕之后,就执行非静态的东西,按照以下顺序执行(你在初始化(1),(5)的过程中,下面的步骤都是做为静态的形式体现的,因为(1),(5)被当成是静态变量 ):
1.先为成员变量分配空间,设置成员的值为默认的初始值(0,false,null)
2.调用对象的构造方法(但是还没有执行构造方法体)
3.隐式或显式调用父类的构造方法(但是还没有执行构造方法体)
4.执行父类的非静态代码块
5.执行父类的构造方法。
6.使用初始化程序和初始块初始化成员。
7.执行子类的非静态代码块
8.执行子类的构造函数
别忘了最后一步,执行子类的子类的静态代码块(如果没有执行过的话)。
关于(2),(3),(4)初始化过程是一样的。
初始化的过程去先去执行父类的静态的东西,然后执行子类静态的东西,(如上所示)静态的都执行完毕后,按照上面写的1-8的步骤来执行非静态的内容。
至于为什么不能共存,当你去初始化 (3)的过程中会在初始化非静态变量的时候上述步骤所示的第6这个步骤去new一个子类对象,这个时候又返回1的步骤,在1到6的步骤中一直循环的new子类对象,永远执行不到7,8的步骤,相信你在运行结果里会看到,子类的非静态代码块和构造函数永远都执行不到,所以你永远都不能初始化一个子类对象,只能在内存空间中去无限的new子类,程序运行一阵儿,内存那哥们就要画圈圈诅咒你了~~~{:soso_e127:}
(以上是个人见解,如有纰漏,望请指正,谢谢~)
|