C#之構造函數

構造函數分爲:

1.實例構造函數

2.私有構造函數

3.靜態構造函數

構造函數是一種特殊的方法,主要是爲了給初始化對象賦初值。

1.實例構造函數


使用new

表達式創建某個類

的對象時,會使用實例構造函數創建和初始化所有實例成員變量。



  

    

   public

    

   class

    ProgramTest

    {

        

   int

    j;

        

   public

    ProgramTest()

        {

            j 

   =

    

   4

   ;

            Console.WriteLine(

   "

   I am ProgramTest,{0}

   "

   , 

   j

   );

        }

        

   static

    

   void

    Main(

   string

   [] args)

        {

   


               ProgramTest pt 

   =

    

   new

    ProgramTest();

            Console.Read();

        }

  

  結果爲:I am ProgramTest,4 

在此次實驗中,我們首先定義了一個私有成員j,經過初始化給他賦了一個初值4,當我實例化類ProgramTest時,就會執行實例構造函數。


諸如此類不帶參數的構造函數叫“默認構造函數”,

如果某個類沒有構造函數,則會自動生成一個默認構造函數,並使用默認值來初始化對象字段。




  public

   

  class

   ProgramTest

    {

        

  int

   j;

        

  public

   ProgramTest()

        {

            Console.WriteLine(

  "

  I am ProgramTest,{0}

  "

  , j);

        }

        

  static

   

  void

   Main(

  string

  [] args)

        {

            ProgramTest pt 

  =

   

  new

   ProgramTest();

            Console.Read();

        }


    }


  結果爲:I am ProgramTest,

  0

    




也可以創建帶有參數的構造函數



   

  public

   

  class

   ProgramTest

    {

        

  int

   j;

        

  public

   ProgramTest(

  int

   i)

        {

            j 

  =

   

  2

  ;

            Console.WriteLine(

  "

  I am ProgramTest,i={0},j={1}

  "

  ,i, j);

        }

        

  static

   

  void

   Main(

  string

  [] args)

        {

  


              ProgramTest pt 

  =

   

  new

   ProgramTest(

  1

  );

            Console.Read();

        }


  


  結果爲:I am ProgramTest i=1,j=

  2 


  


那若是一個類中既有無參構造函數,又有有參構造函數那會怎麼樣呢?



   

  public

   

  class

   ProgramTest

    {

        

  int

   j;

        

  public

   ProgramTest()

        {

            j 

  =

   

  3

  ;

            Console.WriteLine(

  "

  I am ProgramTest 默認構造函數,j={0}

  "

  , j);

        }

        

  public

   ProgramTest(

  int

   i)

        {

            j 

  =

   

  2

  ;

            Console.WriteLine(

  "

  I am ProgramTest 有參構造函數,i={0},j={1}

  "

  ,i, j);

        }

        

  static

   

  void

   Main(

  string

  [] args)

        {

  


              ProgramTest pt1 

  =

   

  new

   ProgramTest();

            ProgramTest pt2 

  =

   

  new

   ProgramTest(

  1

  );

            Console.Read();

        }


  


  結果爲:I am ProgramTest 默認構造函數 j=

  3

       

  I am ProgramTest 有參構造函數 i=1,j=2


  


可見,若是兩者同時存在,那麼看類實例化時,是怎麼實例的。

2.私有構造函數


私有構造函數是一種特殊的實例構造函數。

它通常用在只包含靜態成員的類中。 



如果類具有一個或多個私有構造函數而沒有公共構造函數,則其他類(除嵌套類外)無法創建該類的實例。





      public

   

  class

   Test

    {

        

  private

    Test()

        {

            Console.WriteLine(

  "

  I am Test

  "

  );

        }

    }

    

  public

   

  class

   ProgramTest

    {

        

  int

   j;

        

  private

   ProgramTest()

        {

            j 

  =

   

  3

  ;

            Console.WriteLine(

  "

  I am ProgramTest 默認構造函數,j={0}

  "

  , j);

        }

        

  static

   

  void

   Main(

  string

  [] args)

        {

            Test t 

  =

   

  new

   Test();

            ProgramTest pt1 

  =

   

  new

   ProgramTest();

            Console.Read();

        }

    }


結果:這時你會發現編譯器會提示你,你無法創建Test的實例

(即使你在Test類中添加一個靜態成員,結果依然會提示因爲該構造函數受其保護級別的限制而不可訪問) 


若是隻在自己類裏有私有類呢?




    

  public

   

  class

   ProgramTest

    {

        

  int

   j;

        

  private

   ProgramTest()

        {

            j 

  =

   

  3

  ;

            Console.WriteLine(

  "

  I am ProgramTest 默認構造函數,j={0}

  "

  , j);

        }

        

  static

   

  void

   Main(

  string

  [] args)

        {

  


              ProgramTest pt1 

  =

   

  new

   ProgramTest();

            Console.Read();

        }

    }


結果:I am ProgranmTest 默認構造函數,j=3 


注意,如果您不對構造函數使用訪問修飾符,則在默認情況下它仍爲私有構造函數。但是,通常顯式地使用private修飾符來清楚地表明該類不能被實例化。

若是一個類中既有實例構造函數又有私有構造函數,那麼當實例對象是會怎麼執行呢?




   

  public

   

  class

   Test

    {

        

  int

   i;

        

  private

    Test()

        {

            i 

  =

   

  1

  ;

            Console.WriteLine(

  "

  I am Test 默認構造函數 i={0}

  "

  , i);

        }

        

  public

   Test(

  int

   i)

        {

            Console.WriteLine(

  "

  I am Test 有參構造函數 i={0}

  "

  , i);

        }

    }

    

  public

   

  class

   ProgramTest

    {

        

  static

   

  void

   Main(

  string

  [] args)

        {

            Test t 

  =

   

  new

   Test();  

  //編譯器提示:因爲該構造函數受其保護級別的限制而不可訪問        

  

            Console.Read();




若是隻執行有參構造函數呢?



    

  public

   

  class

   Test

    {

        

  int

   i;

        

  private

    Test()

        {

            i 

  =

   

  1

  ;

            Console.WriteLine(

  "

  I am Test 默認構造函數 i={0}

  "

  , i);

        }

        

  public

   Test(

  int

   i)

        {

            Console.WriteLine(

  "

  I am Test 有參構造函數 i={0}

  "

  , i);

        }

    }

    

  public

   

  class

   ProgramTest

    {

        

  static

   

  void

   Main(

  string

  [] args)

        {

            Test t 

  =

   

  new

   Test(

  2

  );

            Console.Read();

        }

    }


結果:I am Test 有參構造函數 i=2 


3.靜態構造函數

靜態構造函數用來初始化靜態變量,這個構造函數是屬於類的,而不是屬於哪個實例的。



  就是說這個構造函數只會被執行一次。也就是在創建第一個實例或引用任何靜態成員之前,由.NET自動調用。



  

    

   public

    

   class

    Test

    {

        

   static

    

   int

    i;

        

   static

     Test()

        {

            i 

   =

    

   1

   ;

            Console.WriteLine(

   "

   I am Test 默認構造函數 i={0}

   "

   , i);

        }

    }

    

   public

    

   class

    ProgramTest

    {

        

   static

    

   void

    Main(

   string

   [] args)

        {

            Test t1 

   =

    

   new

    Test();

            Console.Read();

        }

    }

  

  結果爲:I am Test 默認構造函數 i=1 



靜態構造函數的特點:


1.靜態構造函數既沒有訪問修飾符,也沒有參數。


2.

在創建第一個實例或引用任何靜態成員之前,將自動調用靜態構造函數來初始化類,也就是無法直接調用靜態構造函數,也無法控制什麼時候執行靜態構造函數。


3.一個類只能有一個靜態構造函數,最多隻能運行一次。

4.靜態構造函數不可以被繼承。

5.如果沒有靜態構造函數,而類中的靜態成員有初始值,那麼編譯器會自動生成默認的靜態構造函數。

如果靜態默認構造函數和公有默認構造函數同時存在,會怎麼樣呢?




      public

   

  class

   Test

    {

        

  static

   

  int

   i;

        

  static

    Test()

        {

            i 

  =

   

  1

  ;

            Console.WriteLine(

  "

  I am Test 靜態默認構造函數 i={0}

  "

  , i);

        }

        

  public

   Test()

        {

            Console.WriteLine(

  "

  I am Test 公有默認構造函數 i={0}

  "

  , i);

        }

    }

    

  public

   

  class

   ProgramTest

    {

        

  static

   

  void

   Main(

  string

  [] args)

        {

            Test t1 

  =

   

  new

   Test();

            Console.Read();

        }

    }


結果:I am Test 靜態默認構造函數 i=1


   



       I am Test 公有默認構造函數 i=1


  




如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用靜態默認構造函數會怎麼樣呢?




  

    

   public

    

   class

    Test

    {

        

   static

    

   int

    i;

        

   static

     Test()

        {

            i 

   =

    

   1

   ;

            Console.WriteLine(

   "

   I am Test 靜態默認構造函數 i={0}

   "

   , i);

        }

        

   public

    Test(

   int

    j)

        {

            Console.WriteLine(

   "

   I am Test 公有有參構造函數 i={0}

   "

   , j);

        }

    }

    

   public

    

   class

    ProgramTest

    {

        

   static

    

   void

    Main(

   string

   [] args)

        {

            Test t1 

   =

    

   new

    Test();

     

   //系統會提示錯誤       

   

            Console.Read();


  

          } 

      } 



  如果靜態默認構造函數和公有有參構造函數同時存在,我實例化類讓它調用公有構造函數會怎麼樣呢?



  

       public

    

   class

    Test

    {

        

   static

    

   int

    i;

        

   static

     Test()

        {

            i 

   =

    

   1

   ;

            Console.WriteLine(

   "

   I am Test 靜態默認構造函數 i={0}

   "

   , i);

        }

        

   public

    Test(

   int

    j)

        {

            Console.WriteLine(

   "

   I am Test 公有有參構造函數 i={0}

   "

   , j);

        }

    }

    

   public

    

   class

    ProgramTest

    {

        

   static

    

   void

    Main(

   string

   [] args)

        {

            Test t1 

   =

    

   new

    Test(

   2

   );

            Console.Read();

        }

    }

  

  結果:I am Test 靜態默認構造函數 i=1

     I am Test 公有有參構造函數 j=2 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章