C#构造函数在基类和父类中的执行顺序

作者:農碼一生 时间:2021-10-24 06:58:03 

一、简介

当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。
当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数。

二、代码案例

父类代码:

#region 父类

/// <summary>
   /// 测试构造函数——需要被构造类 Fu
   /// </summary>
   class Fu
   {
       private int x;//一个简单的私有字段
       /// <summary>
       /// 构造函数
       /// </summary>
       public Fu()
       {
           Console.WriteLine("会先调用这里:这是父类");
       }

/// <summary>
       /// 父类中的有参构造方法
       /// </summary>
       /// <param name="x"></param>
       public Fu(int x)
       {
           this.x = x;
           Console.WriteLine("x赋值完成");
       }

/// <summary>
       /// 父类构造C函数
       /// </summary>
       /// <param name="x"></param>
       /// <param name="b"></param>
       /// <param name="c"></param>
       public Fu(int x, int b, string c)
       {
           this.x = x;
           Console.WriteLine("x赋值完成" + x + b + c);
       }

/// <summary>
       /// 具有7个参数的构造函数
       /// </summary>
       /// <param name="a"></param>
       /// <param name="a1"></param>
       /// <param name="a2"></param>
       /// <param name="a3"></param>
       /// <param name="a4"></param>
       /// <param name="a6"></param>
       /// <param name="a5"></param>
       public Fu(int a, int a1, int a2, int a3, int a4, int a6, int a5)
       {
           Console.WriteLine("最长参数构造运行");
           Console.WriteLine(a + "|" + a1 + "|" + a2 + "|" + a3 + "|" + a4 + "|" + a5 + "|" + a6 + "|"); //在函数中让传入参数对Fu类对象进行初始化
           //例如有如下多个私有字段,在类对象初始化的时候,对其变量初始化。用构造函数最为简单
           this.a = a; //传入参数,在对象实例化后,对其私有变量进行赋值操作
           this.a1 = a;
           this.a2 = a;
           this.a3 = a;
           this.a4 = a;
           this.a5 = a;
           this.a6 = a;
       }

private int a;
       private int a1;
       private int a2;
       private int a3;
       private int a4;
       private int a5;
       private int a6;
   }
   #endregion

子类代码:

#region 子类

/// <summary>
   /// 派生类继承父类
   /// </summary>
   class Derived : Fu
   {
       /// <summary>
       /// 会先调用父类的构造函数,然后再调用子类这边的有参构造函数
       /// </summary>

//先调用父类无参,再调用子类无参
       //当我们没有在子类构造函数中写上 base(),默认会先调用父类中无参的构造函数,再调用子类。

public Derived() //: base() //重新构造 :调用父类中无参的构造函数,在这里写不写调用结果一致
       {
           Console.WriteLine("这是派生类-无参-构造函数");
       }

private int y;

/// <summary>
       /// 构造函数
       /// </summary>
       /// <param name="x"></param>
       /// <param name="y"></param>
       /// 当我们没有在子类构造函数中 写上 base(),默认会先调用父类中无参的构造函数
       /// 当在有参构造函数后写上base时,只调用子类构造函数中有参的构造函数,隐藏父类无参构造函数
       public Derived(int x, int y) /*: base(x)*/
       {
           this.y = y;
           Console.WriteLine("这是y赋值完成");
       }

/// <summary>
       /// 多参数
       /// </summary>
       /// <param name="x"></param>
       /// <param name="a"></param>
       public Derived(int x, string a)// : base(x, x, x, x, x, x, x) //这里写了 base 会先调用父类,再调用当前子类进行构造
       {
           y = x;
           Console.WriteLine(a + "第三方法");
       }
   }

#endregion

Main()调用:

#region Main 入口
   /// <summary>
   /// 程序
   /// </summary>
   class Program
   {
       /// <summary>
       /// 主入口
       /// </summary>
       /// <param name="args"></param>
       static void Main(string[] args)
       {
           Derived d = new Derived();
           Console.WriteLine("-----------------------以上为无参构造------------------------------------------");
           Derived d1 = new Derived(1, 2);
           Console.WriteLine("-----------------------以上为2个参数构造---------------------------------------");
           Derived d2 = new Derived(1, "1");
           Console.WriteLine("-----------------------以上为2个参数构造,6个私变量----------------------------");

//先调用有参的构造函数一旦被调用,无参的构造函数都不会被调用了
           //先执行父类的构造函数,才执行子类的
           Console.ReadLine();
       }
   }
   #endregion

三、输出结果

会先调用这里:这是父类
这是派生类-无参-构造函数
-----------------------以上为无参构造------------------------------------------
会先调用这里:这是父类
这是y赋值完成
-----------------------以上为2个参数构造---------------------------------------
最长参数构造运行
1|1|1|1|1|1|1|
1第三方法
-----------------------以上为2个参数构造,6个私变量----------------------------

来源:https://www.cnblogs.com/wml-it/p/14798157.html

标签:C#,构造,函数,执行,顺序
0
投稿

猜你喜欢

  • SpringCloud Eureka服务注册中心应用入门详解

    2022-02-23 08:48:44
  • Flutter 状态管理的实现

    2023-08-21 02:38:33
  • Java实现打字游戏

    2021-11-02 16:46:56
  • springBoot集成Elasticsearch 报错 Health check failed的解决

    2022-12-07 05:18:16
  • 初步认识C#中的Lambda表达式和匿名方法

    2023-07-03 00:23:28
  • Java服务假死之生产事故的排查与优化问题

    2022-01-12 04:03:37
  • c#和avascript加解密之间的互转代码分享

    2022-03-22 10:15:28
  • springboot整合mybatis实现数据库的更新批处理方式

    2023-11-29 07:08:37
  • Java多线程之Semaphore实现信号灯

    2023-09-19 23:04:51
  • Java中JavaBean对象和Map的互相转换方法实例

    2021-07-12 04:46:05
  • 学生视角带你了解Java内部类

    2022-09-29 17:51:04
  • mybatis-plus分页查询的实现示例

    2023-11-25 04:57:57
  • Flutter 底部弹窗如何实现多项选择

    2023-06-24 17:08:17
  • C#中WebClient实现文件下载

    2022-10-11 18:04:57
  • java实现给图片加铺满的网格式文字水印

    2023-07-30 05:22:12
  • JavaMail入门教程之发送邮件(3)

    2023-02-01 20:01:16
  • 详解Spring Boot Profiles 配置和使用

    2021-10-05 22:54:57
  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    2021-11-18 12:18:05
  • java中this与super关键字的使用方法

    2022-05-04 22:03:29
  • 彻底解决tomcat中文乱码问题方案

    2023-06-25 17:24:46
  • asp之家 软件编程 m.aspxhome.com