C#建構函式在繼承過程中的執行順序

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.