网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  java类的完整构造执行顺序     
  文章作者:未知  文章来源:水木森林  
  查看:82次  录入:管理员--2007-11-17  
 

    这里只说一个完整的结果,至于为什么是这样的顺序,可以参考我以前的文章:深入剖析java类的构造方式

  1. 如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  2. 如果类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  3. 将类的成员赋予初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;对象类型的初始值为null)
  4. 如果构造方法中存在this()调用(可以是其它带参数的this()调用)则执行之,执行完毕后进入第7步继续执行,如果没有this调用则进行下一步。(这个有可能存在递归调用其它的构造方法)
  5. 执行显式的super()调用(可以是其它带参数的super()调用)或者隐式的super()调用(缺省构造方法),此步骤又进入一个父类的构造过程并一直上推至object对象的构造。
  6. 执行类申明中的成员赋值和初始化块。
  7. 执行构造方法中的其它语句。

    其中第4步是比较麻烦的,因为this调用实际上会调用类的另外一个构造方法,最终应该是执行类的某个构造方法,它可能会显示的调用super,但是无论是否调用super,最终都是执行super的,也就是父类的构造方法并一直这样递归到object,所以在子类和父类的构造中,首先构造或者说执行的是父类的构造,但是它是由子类的构造方法调用的,先于构造方法的方法体里面的内容,这个是由编译器决定的。所以我感觉简单直观一些的顺序表述应该是:

  1. 如果父类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  2. 如果类有静态成员赋值或者静态初始化块,执行静态成员赋值和静态初始化块
  3. 将类的成员赋予初值(原始类型的成员的值为规定值,例如int型为0,float型为0.0f,boolean型为false;对象类型的初始值为null)
  4. 执行构造方法,并可能递归调用this(),最终先执行父类的构造方法并一直递归到object的构造方法的执行
  5. 父类的构造方法执行完成后,执行类申明中的成员赋值和初始化块。
  6. 执行构造方法中的其它语句。

最终的简化顺序版本是:

  1. 父类的静态成员赋值和静态块
  2. 子类的静态成员和静态块
  3. 父类的构造方法
  4. 父类的成员赋值和初始化块
  5. 父类的构造方法中的其它语句
  6. 子类的成员赋值和初始化块
  7. 子类的构造方法中的其它语句

2006年11月16日更新:
    针对留言中提到的那个文章中的问题发现这个顺序也是有不足的情况,这个顺序是一般的顺序,但是有可能被打破,留言中的那篇文章就是一个例子,因为在执行静态初始化块的时候先执行了类的构造,打破了这个一般顺序。所以这个顺序有个前提就是静态赋值和初始化块中没有对本类的实例化语句。
对于那个文章中的问题,作者最后的解决方法可行,但是不见得是最好的,可以简单的修改静态赋值和静态初始化块的顺序,修改后的代码片断为:
public class cachingenumresolver {   
    private static map code_map_cache;   
    /*msgcode->category内存索引*/
    static {       
        code_map_cache = new hashmap();       
        //为了说明问题,我在这里初始化一条数据       
        code_map_cache.put("0","北京市");
    }
    //单态实例 一切问题皆由此行引起   
    private static final cachingenumresolver single_enum_resolver = new    cachingenumresolver(); 

 
 
上一篇: eclipse 3.2 java开发工具的新特性    下一篇: 入门基础 java参数传递方式
  相关文档
精通hibernate之映射继承关系八 11-17
有关松散耦合与接口的使用 11-17
createfolder 方法 11-16
wireless messaging api 11-16
junit学习笔记之netbeans篇 11-17
使用struts,ibaits和jstl开发简便通用的文件上传系统(5) 11-17
j2se综合:深入理解javahelp结构的好处 02-25
开发框架:关于struts 连接数据库的问题 01-22
使用forte for java开发ejb(下) 11-17
获取滚动文本框textarea焦点位置信息 11-17
在清单里设置主类 11-17
java程序中的多线程 11-17
在java程序中实现高精度打印 11-16
怎 样 在applet 中 发email 11-17
java socket编程(三)服务器sockets 11-16
将数据库操作封装到javabean 11-17
web 服务代理组件创建 jsf web 服务客户端(3) 11-17
文件上传下载(1) 11-17
jade:远程机器的agent通信应注意的问题 11-16
java程序员必读:基础篇(5)接口和包 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息