任何构造函数都可以进行配置,以便在执行自己的代码前调用其它构造函数。

我们首先看看在创建类的实例时会发生什么情况。为了实例化派生的类,必须实例化它的基类。而要实例化这个基类,又必须实例化这个基类的基类,这样一直实例化到System.Object为止。结果是无论使用什么构造函数实例化一个类,总是要先调用System.Object.Object()。

如果对一个类使用非默认的构造函数,默认的情况是在其基类上使用匹配于这个构造函数签名的构造函数。如果没有找到这样的构造函数,就使用基类的默认构造函数(根类System.Object总是要使用默认的构造函数,因为这个类没有非默认的构造函数)。

我们以下面这个小代码段例子作一些说明:

public class MyBaseClass
     {
         public MyBaseClass()
         {
         }

public MyBaseClass(int i)
         {
         }
     }
     public class MyDerivedClass : MyBaseClass
     {
         public MyDerivedClass()
         {
         }
         public MyDerivedClass(int i)
         {
         }
         public MyDerivedClass(int i, int j)
         {
         }
     }

如果以下面的方式实例化MyDerivedClass:

MyDerivedClass myObj = new MyDerivedClass();

则发生下面的一系列事件:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass()构造函数。
    3.执行MyDerivedClass.MyDerivedClass()构造函数。

如果使用下面的语句:

MyDerivedClass myObj = new MyDerivedClass(4);

则发生下面的—系列事件:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(int i)构造函数。

如果使用下面的语句:

MyDerivedClass myObj = new MyDerivedClass(4,8);

则发生下面的—系列事件:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass()构造函数。
    3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数。

有时需要对发生的事件进行更多的控制。例如,在上面的实例化范例中,需要有下面的事件序列:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(int i, int j)构造函数。

使用这个序列可以在编写MyBaseClass(int i)中使用int i参数的代码,即MyDerivedClass(int i, int j)构造函数要做的工作比较少,只需要处理int j参数(假定int i参数在两种情况下有相同的含义)。我们仅需指定在派生类的构造函数定义中所使用的基类的构造函数,如下所示:

public class MyDerivedClass : MyBaseClass
     {
          ……
         public MyDerivedClass(int i, int j) : base(i)
         {
         }
     }

其中,base关键字指定.NET实例化过程,以使用基类中匹配指定签名的构造函数。这个例子中使用一个int参数,所以在实例化序列中应调用MyBaseClass(int i)。

同时我们也可以使用这个关键字指定基类构造函数的字面值。

public class MyDerivedClass : MyBaseClass
     {
         public MyDerivedClass() : base(5)
         {
         }
         ……
     }

这段代码将执行以下序列:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass()构造函数。

下面我们介绍另一个关键字this。这个关键字指定在调用指定的构造函数前,.NET实例化过程对当前类使用非默认的构造函数。

public class MyDerivedClass : MyBaseClass
     {
         public MyDerivedClass() : this(5,6)
         {
         }
         ……
         public MyDerivedClass(int i, int j) : base(i)
         {
         }
     }

这段代码将执行以下序列:
        1.执行System.Object.Object()构造函数。
    2.执行MyBaseClass.MyBaseClass(int i)构造函数。
    3.执行MyDerivedClass.MyDerivedClass(int i,int j)构造函数。
    4.执行MyDerivedClass.MyDerivedClass()构造函数。

唯一的限制是使用this或base关键字只能指定一个构造函数。但是如上所示,这并不是一个很严厉的限制,按照上述方式仍可以构造相当复杂的执行序列。
原文URL:http://www.cnblogs.com/Bear-Study-Hard/archive/2006/01/09/313551.html

转载于:https://www.cnblogs.com/jeriffe/articles/1421265.html

【转】构造函数的执行序列相关推荐

  1. 构造函数的执行序列(读书笔记)

    学习是一个不断回归的过程,做过一些项目,再去读一些书籍,发现有些概念忽然之间竟能理解得更加透彻,真是让人非常快乐,你也希望我快乐,不是么? 继承关系如下: public class MyBaseCla ...

  2. java 构造函数的执行顺序

    在此我用类似<Thinking in Java>的一个例子来说明 pakage com.yqs.test class Milk { publcic Milk() { System.out. ...

  3. java构造函数的执行顺序,java构造函数和初始化函数的执行顺序

    1,静态变量.静态代码块.变量.普通代码块.mian方法.构造函数的执行顺序是:(静态变量.静态代码块)>    main方法 >(变量.普通代码块)>构造函数. 2,如果子类调用了 ...

  4. 派生类构造函数的执行顺序

    一个派生类构造函数的执行顺序如下: 虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数). 基类的构造函数(多个普通基类也按照继承的顺序执行构造函数). 对象的vptr被初始化: 成员对象构 ...

  5. 静态代码块、非静态代码块、构造函数三者执行顺序

    主要探讨一下关于静态代码块,非静态代码块,构造函数的执行顺序. 如有错误,欢迎指出. 首先: 静态成员变量和静态代码块的优先级是一样的,先定义的先执行. 在创建一个对象的时候会执行非静态代码块和构造函 ...

  6. 构造代码块、静态代码块、无参构造函数和有参构造函数的执行顺序

    一直对构造代码块.静态代码块.无参构造函数和有参构造函数的执行顺序和执行次数混淆不清,所以记录一下它们的执行顺序以及执行次数.记录的不是很详细,留待补充. 代码: package com.yoko.t ...

  7. 继承下构造函数的执行顺序

    这里先给出结论,在贴出代码与执行结果~ 一个派生类构造函数的执行顺序如下: 第一步执行:虚拟基类的构造函数(多个虚拟基类则按照继承的顺序执行构造函数). 第二步执行:基类的构造函数(多个普通基类也按照 ...

  8. C++三大继承构造函数的执行顺序详解

    写的挺好的,关于继承和构造函数的先后顺序问题. 转自: http://blog.csdn.net/daheiantian/archive/2011/02/18/6438782.aspx 一.单继承 核 ...

  9. 静态块、自由块及构造函数的执行顺序

    静态块和静态变量在类的加载时被执行:加载子类时,会预先加载父类,因此父类中如果有静态块,则最先执行之,然后立即执行子类的静态块: 如果一个类中有多个静态块,则按照编码的先后顺序执行 注:因为一个类只会 ...

最新文章

  1. JAVA基础10-继承(1)
  2. MyBatis批量插入
  3. asp.net远程调用WebService的两种方法
  4. Matlab:成功解决The option is not valid. The options must be'double','native','default','omitnan', or'inc
  5. c语言保存图片image,iOS 保存图片到【自定义相册】
  6. 前端JavaScripts基础知识点讲义代码
  7. 帧中继(Frame Relay)实验
  8. 计算广告(computational advertising)
  9. Delphi 2010手动安装indy10.5.7
  10. 面试:Android网络优化
  11. photoshop技巧分享:psd格式批量转换jpg格式一键完成
  12. Cloakroom BZOJ2794 POI2012(背包问题)
  13. 解析DeDecms系统的SEO内部优化技巧
  14. win10切换输入法快捷键_分享27个使用Win10的技巧,希望能助你提升Win10的使用效率。...
  15. 深入理解Linux内核使用浮点运算问题
  16. 微博android升级7.000,华为 Android 7.0 升级计划曝光:G9 青春版 /Nova 也有份
  17. 知道这六种拍摄技巧,让你玩转夕阳拍摄
  18. Matlab中的数值精度问题
  19. 【C#】使用WinRAR进行压缩和解压
  20. 运筹学——修正单纯形法

热门文章

  1. 面向对象的C语言开发框架:Nesty
  2. 正则匹配所有包括换行符
  3. 面试高频题:在数组中查找元素第一个和最后一个出现的位置
  4. shell实例第12讲:给定目录找出包含关键字的文件
  5. linux有三个查看文件的命令:more、cat、less
  6. 【译】混沌工程与区块链
  7. rrdtutorial
  8. .NET独有的精巧泛型设计模式
  9. 单网段DHCP服务器的架设
  10. linux shell 字符串 数组,bash shell函数返回数组字符串