代考首页 | 代考价格 | 代考流程 | 证书查询 | 信誉评价 | 代考论坛 | 海外港台代考价格 | 题库报价
  思科CISCO | 微软MICROSOFT | 华为HCNE | ORACLE认证 | SUN认证 | CIW认证 | IBM认证 | LPI认证 | CCNA专题 | MCSE专题 | ADOBE | 仿真题库
   会员登陆
用户:
密码:

   代考详细流程

代考地图
代考思科CCNA认证
代考思科CCNP认证
代考微软MCP认证
代考微软MCSE2000
代考微软MCSE2003
代考微软MCSD.NET
代考LPI认证
代考微软全能认证
代考思科微软全能认证
代考思科全能认证
代考思科CCDA认证
代考思科CCDP认证
代考思科CCIP认证
代考思科CCSP认证
代考思科CCVP认证
代考微软MCTS技术专家
代考MCITP微软IT专家
代考MCPD专业开发人员

   IT代考--本站服务
  itsky100.comIT认证代考 联盟的 代考 机构,提供 CCNA 代考 ,MCSE 代考 ,MCP 代考 ,CCNP 代考 ,JAVA 代考 ,ORACLE 代考 等各种IT 认证替考 服务。
  免费提供 IT认证 学习资料 考试题库 CCNA CCNP JAVA CIW MCSE MCSD教学资料 免费下载。
  IT认证代考 ,具体操作在我们的考试中心进行,通过百分百,请您绝对放心。
 
 
 
 
 
 
  首页>>SUN认证>>正文
 
Java类的完整构造执行顺序
这里只说一个完整的结果,至于为什么是这样的顺序,可以参考我以前的文章:深入剖析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(); 

 

 

版权所有 国际IT认证代考联盟网

Copyright (C) 2006 www.ITSKY100.com All rights reserved