A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 土匪大学生 中级黑马   /  2015-6-11 08:30  /  641 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 土匪大学生 于 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!!!,而后再往下执行弹栈……。







3 个回复

倒序浏览
学习一下,支持一下!
回复 使用道具 举报
楼主以后最好不要用红色字体了,看得眼睛好痛啊
回复 使用道具 举报
{:3_62:}啊  我的眼睛.......不过还是谢谢楼主啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马