本帖最后由 土匪大学生 于 2015-6-11 08:30 编辑
曾经得到过大家的帮助,所以做些总结,让那些有需要的人得帮助.
一: 单个类初始化执行顺序(并且其构造函数内没有待初始化的静态对象引用时):静态代码块》构造代码块》构造函数。
一个java程序运行顺序: 1调用JVM命令去执行某个.class文件.
2先加载类及static,如果有父类则优先子类加载及(父类的)static。
3创建对象,如果有父类则先执行父类的构造代码块,然后执行父类的构造函数; 再执行子类的构造代码块,最后执行子类的构造函数。
二:
单个类首次创建对象的执行例程:加载main所在的类》main入栈》执行到new fu()时,加载fu类》 在堆内存分配空间new 类名.()且给成员变量赋默认值(如:null,0,0.0,\u000)》先调用super()后会返回来执行构造block或对属性显示初始化(实际上之前会先调用super()>Object的构造函数)》构造函数。
注意:
1、如果有在类定义时就给成员变量赋初始值的语句,语句最好写在structure block之前,否则(当block有使用该成员变量时)编译 (JDK1.7)不通过,提示非法向前引用。(解决方法:在block的成员变量前加上this.)
2、如果加载到static block 或static成员有定义对象(如:Fu类的对象)时(不会继续往下加载),则会先加载Fu类,然后创建一个对象给成员使用后再返回继续加载或运行。
3、如果structure block或非static成员有定义对象时,也会同上。
4、如果.class已被加载,则创建对象时不会再加载(即static修饰的内容只执行一次,在类加载的时候),直接给成员变量显示初始化或执行structure block,然后再执行构造器。
三:
子类创建对象时的执行顺序(与单个类有所不同):加载main所在的test类》main入栈》当执行到new zi()时,
会先加载zi类的父类fu,然后再返回来加载zi类》zi()入栈,但会先调用super()入栈即fu类的构造函数》同理,
fu类的super()也会入栈即Object类》剩下的就是弹栈的过程。
注意:当每次super()弹栈完毕后会先执行子类的构造block!!!,而后再往下执行弹栈……。
|
|