`
sandy_leen
  • 浏览: 72130 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

对象初始化流程梳理

阅读更多

转自:http://www.blogjava.net/cheneyfree/archive/2008/05/24/202643.html

 

类Person和子类Son,体现对象初始化流程的代码:

public class Person {
    Bow b1 = new Bow(1);
    static {
        System.out.println("Person staticstatic块1");
    }
    {
        System.out.println("Person hello非static块1");
    }
    Bow b2 = new Bow(2);
    static Bow b3 = new Bow(3);
    Person() {
        System.out.println("PersonPerson类的构造器");
    }
    {
        System.out.println("Person hello非static块2");
    }
    static {
        System.out.println("Person staticstatic块2");
    }
}
class Son extends Person {
    Bow b4 = new Bow(4);
    static {
        System.out.println("Test staticstatic块1");
    }
    {
        System.out.println("Test hello1非static块1");
    }
    Bow b5 = new Bow(5);
    static Bow b6 = new Bow(6);
    Son() {
        System.out.println("TestTest类的构造器");
    }
    {
        System.out.println("Test hello2非static块2");
    }
    static {
        System.out.println("Test static2static块2");
    }
    public static void main(String[] args) {
        System.out.println("main");
        new Son();
    }
}
class Bow {
    Bow(int m) {
        System.out.println("Bow(" + m + ")");
    }
}

 

 执行结果:
Person static...static块1
Bow(3)
Person static...static块2
Test static...static块1
Bow(6)
Test static2...static块2
main...
Bow(1)
Person hello...非static块1
Bow(2)
Person hello...非static块2
Person...Person类的构造器
Bow(4)
Test hello1...非static块1
Bow(5)
Test hello2...非static块2
Test...Test类的构造器

从上面结果,可以总结出JAVA对象初始化的流程:
 【1】父类static块和父类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
 【2】子类static块和子类static属性(两者的执行先后顺序依据它们在类中具体位置由上至下)
 【3】执行main方法中new关键字之前的代码块
 【4】父类非static块执行和父类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[4][5]步骤)
 【5】父类构造器(完成非static属性初始值的设置) 
 【6】子类非static块执行和子类非static属性(两者的执行先后顺序依据它们在类中具体位置由上至下,如果属性为实例类型,则执行该实例所在类的非static块和非static属性,再执行该类的构造器,即[6][7]步骤)
 【7】子类构造器(完成非static属性初始值设置,如果在子类构造器执行前就返回该非static属性,则该非static属值为属性默认值
   注:针对第【7】点“子类构造器执行前就返回该非static属性”,具体可以见下例:

 

 

public class ParentObjectInit {

    public void test() {

    }
    public ParentObjectInit() {
        test();
    }
}
class ChildObjectInit extends ParentObjectInit {
    private int instanceValue = 20;
    public void test() {
        System.out.println("instance1 value : " + instanceValue);
    }
    public static void main(String[] args) {
        new ChildObjectInit();
    }
}
 

 

这段代码的执行结果:
instance1 value is: 0 因为new 子类ChildObjectInit时,会先初始化父类ParentObjectInit,继而调用父来构造器器,接着执行此构造器中的test()方法,基于多态性,会转而调用子类的test()方法执行子类test()方法代码体,打印出instanceValue的属性默认值。(因为此时打印instanceValue值后,父类构造器才执行结束返回,根本还没轮到子类的初始化工作和子类构造器的执行。)

 

 

分享到:
评论

相关推荐

    对象初始化流程梳理对象初始化流程梳理

    Java中的对象初始化流程是编程实践中一个非常重要的概念,它涉及到类加载、静态初始化块、实例初始化块、构造器等多个方面。下面将详细解释这个过程。 首先,对象初始化流程的起点是程序的入口点,即`main`方法。当...

    mapbox资源请求流程梳理

    ### Mapbox资源请求流程梳理 #### 一、资源请求框架概览 Mapbox是一个功能强大的地图服务工具包,它提供了丰富的API和SDK供开发者使用。本文档将对Mapbox资源请求流程进行深入分析,尤其关注样式(style)加载过程中...

    RGWRados initialize.pdf

    初始化流程复杂,需要精确地按照 Ceph RGW 的设计来进行各项组件的初始化和配置,以确保系统能正确、高效地工作。 在梳理代码流程时,需要关注每个组件的依赖关系、初始化时机、配置参数等关键细节。同时,文档中...

    JavaSE知识点梳理

    构造方法是一种特殊的方法,用于初始化对象的状态。 - **无参构造**:默认构造方法。 - **带参数构造**:如`public MyClass(int id) { this.id = id; }`。 ##### 3.6 static关键字 `static`关键字用于修饰成员...

    软通动力面试流程

    构造方法用于初始化新创建的对象的状态。 2. **字符串操作**: - 选项A正确。`String s = "你好"; int i = 3; s += i;` - 这段代码中,字符串`s`最初被赋值为"你好",然后通过`+=`运算符将整数`i`的值添加到字符...

    算法与程序设计知识梳理(与“对象”有关的文档共95张).pptx

    11. **属性窗口**:允许查看和编辑对象的属性,如窗体或控件的初始设置。 总结来说,这个文档详细介绍了算法的基础概念,程序设计语言的发展,特别是VB语言的使用方法和VB 6.0集成开发环境的组成部分及操作,为初学...

    VC6.0SDI_BOOT流程图示

    在程序启动时,首先会创建`theApp`对象,并通过其初始化函数`InitInstance()`来进行应用程序的初始化工作。 ##### 2. **WinMain()** `WinMain()`是所有Windows应用程序的入口点,但在MFC中,这个函数通常被`...

    SpringBoot (4.71G)精华详解

    10.Spring的Bean定义解析全流程梳理.mp40o*y1U(d#P3J:b.? 11.Spring的Bean加载流程与缓存过程详解.mp4 12.Spring的Bean获取流程深入解读.mp4 13.Spring的Bean创建策略分析.mp4 14.Spring单例Bean的初始化与缓存流程...

    JVM核心知识点梳理以及JVM面试题总结

    Java虚拟机(JVM)是Java程序...- 解释一下类加载机制,包括加载、验证、准备、解析和初始化阶段? 掌握这些JVM核心知识点对于Java开发者来说至关重要,它们不仅帮助理解程序运行机制,还能解决性能问题和优化代码。

    Java编程思想读书笔记.doc

    以上知识点总结了《Java编程思想》前几章的主要内容,涵盖了对象的创建与存储、类的定义、函数参数和返回值、运算符与流程控制以及初始化等方面的基础知识,对于初学者理解和掌握Java语言的基本概念非常有帮助。

    UED团队的设计流程管理【项目】.docx

    UED团队的设计流程管理项目 ...UED团队的设计流程管理项目是一个系统化的设计流程,它需要考虑多个方面的因素,例如用户体验、交互设计、产品应用分析、概念设计、设计原则等,以确保设计的执行顺畅、效率高、质量好。

    2021年上半年信息系统项目管理师考点梳理完整版.docx

    信息系统项目管理师考点梳理 信息系统项目管理是信息系统开发的关键环节,...CMMI 是能力成熟度模型集成,它将软件开发能力分为五个级别:初始级、可重复级、已定义级、已管理级、优化级。CMMI 是软件开发的国际标准。

    系统架构师备考知识点梳理

    备战软考时梳理的一些错题和常考题 案例题: 一、软件结构设计 (一)软件质量属性 (二)风险,敏感点,权衡点 二、结构化软件系统建模 (一)流程图和数据流图 (二)实体和类的区别 (三)Essential Use Cases和...

    Hadoop知识点梳理

    #### 二、Hadoop的初始化与配置 在首次部署Hadoop时,需要对namenode进行格式化操作,以创建初始的元数据目录结构。 **namenode格式化命令**:使用`bin/hdfs namenode -format`命令可以完成这一过程。这一步骤至关...

    信息系统项目管理师考点梳理完整版解读.docx

    ### 信息系统项目管理师考点梳理知识点详解 #### 一、信息系统生命周期 信息系统生命周期是指一个信息系统从构思、设计、实现到最终被废弃所经历的过程。这一周期可以分为四个主要阶段: 1. **信息系统的规划阶段...

    Java就业培训教程张孝祥高清版.pdf

    - 初始化:数组的静态初始化与动态初始化。 - 数组操作:如长度获取、元素访问等基本操作。 #### 三、面向对象(上) - **面向对象概念**: - 面向过程:传统的程序设计方法,侧重于函数的组合。 - 面向对象:...

    Java教程中文版

    - **数组声明与初始化**:演示如何声明和初始化数组,包括一维数组和多维数组。 - **数组操作**:讲解数组的常见操作,如遍历、排序、查找等。 - **数组拷贝**:探讨数组复制的方法,包括浅拷贝和深拷贝的区别。 ...

Global site tag (gtag.js) - Google Analytics