zoukankan      html  css  js  c++  java
  • .net类的初始化机制,顺序,内存分配,

    < DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd>

    &#9733;类成员的初始化顺序, 举例 ChildClass从ParentClass继承而来
    ChildClass child = new ChildClass();

    1. 初始化ChildClass的静态字段(按声明顺序)
    2. 初始化ChildClass的静态构造函数
    3. 初始化ChildClass的实例字段
    4. 调用ChildClass的构造函数,并在此中断, 调用ParentClass的构造函数, 导致ParentClass开始初始化
    5. 初始化ParentClass的静态字段
    6. 初始化ParentClass的静态构造函数
    7. 初始化ParentClass的实例字段
    8. 调用ParentClass的实例构造函数
    9. ParentClass初始化完毕, 调用ChildClass的构造函数,完成创建

    &#9733;如果多重继承,将按上面方式展开,静态构造函数和静态字段都只构造一次.
    &#9733;如果类没有实例化以前,调用该类的静态方法(字段),会引起类的静态字段实例化, 调用静态构造函数. 以后再实例化此类的时候,不再重新实例化静态字段和静态构造函数

    &#9733;这种初始化顺序是由内存分配机制决定的,如我们调用MyClass myClass = new MyClass(), 其产生对象如下:
    1. 计算该类中定义的所有实例字段的size和两个附加对象(type handler(类对象的指针)和syncBlockIndex(指向一块用来管理对象同步的内存))的size并一直递归到object对象,得到其需要分配内存大小, 看剩余内存是否够分配此对象, 不够会导致垃圾回收.
    2. 首先构造MyClass的type对象,type对象包括静态字段和方法表,将其分配在托管堆的loader堆上,注意此对象将不会被GC自动回收, 其生命周期是从创建到AppDomain卸载.
    3. 构造MyClass的实例字段,构造附加type handler并指向type对象, 构造SyncBlockIndex并指向同步内存.
    4. 调用MyClass构造函数,此时会引起其父类初始化, 父类初始化循环上述过程,直至object对象完成创建, 再返回执行子类构造函数直至MyClass, 创建MyClass完成后, 返回其内存地址, 赋值给MyClass的this,并将其引用传给栈上声明的myClass.

  • 相关阅读:
    bzoj1051(明星奶牛)
    hdu4081(秦始皇的道路系统)
    bzoj2330(差分约束)
    JPA & Hibernate 注解
    Hibernate中对象的3种状态:瞬时态、持久态、脱管态
    Spring Data JAP 多个不是必填的查询条件处理
    设计模式
    Java远程方法调用(RMI)
    Javascript注意事项四【提高循环性能的策略】
    Javascript注意事项三【使用假值】
  • 原文地址:https://www.cnblogs.com/netcorner/p/2912152.html
Copyright © 2011-2022 走看看