网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Java服务器Tomcat 5.5.15&n.
.通过Windows XP Embedded更新代理.
.RMI规范--第五章.
.SkipLine 方法.
.Struts开发指南之工作流程.
.赋值运算符 (=).
.JBuilder2005破解及采用JDK1.5.
.对Java嵌套类的讨论.
.如何实例化一个抽象类?.
.Hibernate 连Tomcat数据源配置.
.面向Web的JMS应用系统.
.汉字问题深入谈.
.让XDoclet为你写存根类.
.J2EE综合 svn配置手记.
.关于在Java Web中的入侵检测及简.
.区分过载方法.
.Java核心代码例程之:(JAXP) DOM.
.线程堆:给你的线程命名,察看你.
.Java高级日期概念二.
.软件开发规范(1).

Java类的完整构造执行顺序

发表日期:2008-1-5


    这里只说一个完整的结果,至于为什么是这样的顺序,可以参考我以前的文章:深入剖析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(); 


上一篇:Java对象池技术的原理及其实现 人气:889
下一篇:编写一个基于Java Robot类的屏幕捕获工具 人气:998
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐