zoukankan      html  css  js  c++  java
  • C#的构造函数在基类和父类中执行顺序

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

    一、简介

    当我们没有在子类构造函数中写上 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个私变量----------------------------

     


    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    mysql重置root密码
    node.js和JavaScript的关系
    转Git仓库分支(Branch)和标签(Tag)
    Spring MVC @CookieValue注解(5)
    Spring MVC @RequestParam(5)
    Spring REST(4)
    Spring MVC @PathVariable注解(3)
    Spring MVC @RequestMapping注解详解(2)
    Spring MVC入门示例(1)
    spring @Transactional注解参数详解(13)
  • 原文地址:https://www.cnblogs.com/wml-it/p/14798157.html
Copyright © 2011-2022 走看看