C#构造函数在继承过程中的执行顺序(转)

using System;

namespace Zoo

{

         //************定义基类Animal

         public class Animal

         {

                   static string baseClassName;

                   //public string eatkind;

                   protected string _skincolor;

             static Animal()

                   {

                            baseClassName="动物";

                            //eatkind="肉";

                            Console.WriteLine(baseClassName);

                            //Console.WriteLine(eatkind);

                            Console.WriteLine();

                   }

             public Animal()

        {          

          Console.WriteLine("一只动物出生了!!!");

          Console.WriteLine();            

        }

        protected Animal(string skincolor)

        {

            this._skincolor = skincolor;

            Console.WriteLine("这只动物的颜色为:" + this._skincolor);

            Console.WriteLine();

        }       

         }

        

         //************定义子类Horse继承父类Animal

         public class Horse : Animal

    {

    public Horse()// : base()

        {  

           _skincolor="赤兔马的红";

            Console.WriteLine("一头小马驹出生了。。。。");

            Console.WriteLine("这头小马驹的颜色为:"+this._skincolor); 

            Console.WriteLine();          

        }

        double _weight;

        string _sex;

        public Horse(string skincolor,string sex,double weight):base(skincolor)

        {

            _skincolor = skincolor;

            _weight=weight;

            _sex=sex;      

            //base._skincolor=skincolor;

            Console.WriteLine("一头小马驹出生了。。。。");

            Console.WriteLine("这头小马驹为:"+this._sex); 

            Console.WriteLine("这头小马驹的颜色为:"+this._skincolor);

            Console.WriteLine("这头小马驹的体重为:"+this._weight);

            Console.WriteLine();      

        }       

     }

    

    

    //************定义测试类Demo

          public class Demo

    {

        public static void Main(string[] args)

        {

            //Animal A=new Animal();                

            //Horse h=new Horse();

            Horse hh=new Horse("纯白色","雄性",320);

            Horse hhh=new Horse("纯色","雌性",120);

           

           

        }

    }

}

测试Demo类中Main() 方法不同情况下的结果,研究构造函数的执行过程

1.只执行Animal A = new Animal();

结果: 动物

       一只动物出生了!!!

执行过程: 首先执行基类Animal的静态构造函数static Animal(),在实例化A时执行公共的无参构造函数public Animal();

说明: 类的静态构造函数属于类所有,不必生成实例就可以访问,它是在载入包含类的应用程序时创建的,但静态构造函数不能访问类的实例变量。类的实例成员属于类的实例所有,没有创建实例对象就无法对其进行访问,实例成员可以访问类的静态成员和其它实例成员。类的静态成员属于该类,非静态成员则属于这个类的某个实例在一个类的实例对象的生命周期中最先执行的代码就是类的构造函数。构造函数是用来初始化对象的特殊类型的函数。

2.只执行Horse h=new Horse();

结果:动物

      一只动物出生了!!!

      一头小马驹出生了…….

      这头小马驹的颜色为:赤兔马的红

执行过程:首先执行基类Animal的静态构造函数static Animal(),再实例化基类Animal时执行公共的无参构造函数public Animal();再然后调用Horse类的无参构造函数public Horse() 

3.只执行Horse h=new Horse("纯白色",”雄性”,320);

结果:动物     

         这只动物的颜色为:纯白色

一头小马驹出生了…….

这头小马驹为:雄性

      这头小马驹的颜色为:纯白色

      这头小马驹的体重为:320

执行过程:首先执行基类Animal的静态构造函数static Animal(),再实例化基类Animal时执行Protected带参构造函数public Animal(string skincolor);再然后调用Horse类的带参构造函数public Horse(string skincolor, string skincolor , double weight):base(skincolor)

4.只执行 Horse h=new Horse("纯白色", “雄性”, 320);

       Horse hh=new Horse("纯色", “雌性”, 120);

结果:动物    

         这只动物的颜色为:纯白色

一头小马驹出生了…….

这头小马驹为:雄性

         这头小马驹的颜色为:纯白色

         这头小马驹的体重为:320

        这只动物的颜色为:纯色

一头小马驹出生了…….

这头小马驹为:雌性

      这头小马驹的颜色为:纯色

      这头小马驹的体重为:120

说明:类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数;

最后作一个总结:
1.一般原理是被继承的父类先构造,继承于父类的子类后构造;

2.静态构造函数,静态参数都是优先于非静态构造函数,非静态参数构造;

3.静态构造函数:
(1)用于对静态字段、只读字段等的初始化。              
(2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。        
(3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
(4)静态构造函数是不可继承的,而且不能被直接调用。

4.构造函数就是在创建类对象的时候调用,用来初始化类中的字段以及完成一些调用等工作
5.构造函数是构造对象时调用。如果你不够构造对象,怎么能使用构造函数。在子类中,当然不能继承父类函数。如果能继承,那么你就可以在子类中调用构造函数了,而创建对象时,是系统管理调用构造函数,我们自己不能调用类的构造函数。子类在实现化时,首先调用父类构造函数,实例化父类。之后才是子类自身实例化。  

总算写完了,关于C#的构造函数的学习暂时就告一段落,接下来是接口的学习!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ben_0788/archive/2008/06/07/2520230.aspx

原文地址:https://www.cnblogs.com/Godblessyou/p/2047453.html