`
liyanhui
  • 浏览: 349333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java类的完整构造执行顺序(转)

    博客分类:
  • java
 
阅读更多

转自:http://hi.baidu.com/zhengguobest/blog/item/09a97f0e0eba7dca7bcbe1b1.html

  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类的完整构造执行顺序

    在深入探讨Java类的完整构造执行顺序之前,我们先来明确一下Java中构造函数与类初始化的基本概念。构造函数在创建对象时被调用,用于初始化该对象的状态。而类初始化则是指在类首次被使用时,JVM执行的一系列初始化...

    Java类的基本运行顺序

    在Java编程中,类是构建程序的基本构造块。理解类的运行顺序对于编写高效、可维护的代码至关重要。本文将详细解析Java类的基本运行顺序,包括加载、初始化、执行等阶段,以及相关工具的运用。 首先,我们从类的生命...

    深入理解java构造器机理

    “深入理解Java构造器机理” 在 Java 编程语言中,构造器是一种特殊的方法,用于初始化对象的创建。它是 Java 类中最重要的一个概念。下面将深入讨论构造器的机理、执行顺序、作用及与其他概念的区别。 一、构造器...

    java面试题静态加载顺序构造方法

    记住,面试有可能会标出一些语句的,让你选择这些语句的执行顺序。不过只要知道原理,就没什么难的了。 执行先后顺序: 1、类加载到内存时static 加载进内润 2、调用类的构造方法时先调用父类的构造方法,在调用...

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    Java类继承初始化顺序

    当我们谈论“Java类继承初始化顺序”时,涉及到的关键知识点包括构造器、成员变量的初始化、super关键字以及方法的覆盖。 首先,了解类初始化的顺序至关重要。当创建一个子类实例时,初始化过程遵循以下步骤: 1. ...

    Java常见笔试、面试题目深度剖析,方法重写详解、静态代码块与构造方法执行顺序问题

    本文将深度剖析几个常见的Java面试题目,包括方法重写、静态代码块和构造方法的执行顺序。 首先,我们来讨论**方法重写(Override)**。在面向对象编程中,子类可以继承父类的属性和方法,有时需要根据自己的需求对...

    Java:静态代码块和构造函数执行顺序

    /*大体上顺序是这样的:(也可以说是优先级,同一级的按顺序执行)  1 静态变量,静态代码块(类加载时执行,类不加载不执行)  2 实例变量,实例代码块(创建对象时才执行,不创建对象不执行)  3 构造函数,...

    由浅入深详解Java 类的实例化顺序

    java教程 由浅入深详解Java 类的实例化顺序 在子类对象被实例化的过程中,变量、构造方法以及代码块三者的先后顺序为: 1. 父类的静态变量和静态代码块,按代码先后顺序执行 2. 子类的静态变量和静态代码块,按...

    深入剖析java类的构造方式

    按照Java规范,类实例的构造过程遵循以下顺序: 1. 如果构造方法有参数,那么会先进行参数绑定。 2. 内存被分配给新对象,并将非静态成员变量赋予默认值。原始类型变量(如 int、float、boolean)会得到它们的...

    类执行顺序小结.doc

    Java类的执行顺序是理解Java程序行为的关键,它涉及类的加载、初始化以及构造过程中的各种细节。以下是对类执行顺序的深入解析,基于标题“类执行顺序小结”和描述“关于Java类的执行顺序详解”。 #### 一、类的...

    聚合中类的构造函数调用顺序

    1. **基类构造器的调用**:如果类A继承自类B,那么在类A的构造函数执行之前,会先调用类B的构造函数。这是为了确保基类的部分先得到初始化。 2. **成员变量构造器的调用**:接着,按照声明的顺序,类A中每个成员...

    java面试题-类的初始化顺序.doc

    类--初始化块"); 39. } 40. // 构造器 41. public SubClass() { 42. System.out.println("子类--构造器"); 43. } 44. 45. public static void main(String[]...因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    java中静态代码块与构造方法的执行顺序判断

    在Java编程语言中,了解静态代码块和构造方法的执行顺序是至关重要的,尤其是在处理类的初始化和对象的创建时。下面将详细解释这些概念及其执行逻辑。 首先,静态代码块(也称为静态初始化器)是由`static`关键字...

    深入剖析java类的构造方式.txt

    通过观察程序的输出结果,我们可以清楚地看到整个构造过程的执行顺序。 综上所述,Java中的类构造是一个复杂但有序的过程,涉及多个方面的初始化操作。理解这些基础知识对于编写高效、可靠的Java程序至关重要。

    JAVA程序执行顺序,你了解了吗.doc

    在JAVA编程语言中,程序的执行顺序是程序员需要掌握的关键概念之一,因为它直接影响到程序的行为。以下是关于JAVA程序执行顺序的详细解释: 1. **静态块**: 静态块是在类加载时执行的,它不依赖于类的实例。在...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    详解Java中类的加载顺序

    静态初始化块用于初始化静态成员变量或执行其他静态逻辑,它们的执行顺序取决于在源代码中出现的位置,而不是定义的顺序。静态成员变量的初始化是在声明它们的时候就完成的,如果它们有初始值。 2. **非静态初始化*...

Global site tag (gtag.js) - Google Analytics