1、構造函數:

構造函數是允許將類實例初始化為有效狀態的特殊方法,類被實例化時,自動執行構造函數。
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"運行構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12 }

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
//實例化a時,會自動執行構造函數
c# 類學習_初始化_06
        A a=new A ();
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }
    
c# 類學習_初值_12 }

c# 類學習_初值
c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06 *結果為:
c# 類學習_初始化_06 *運行構造函數
c# 類學習_初值_12 
*/

c# 類學習_初值


2、類中成員變量賦值

如果類中有成員變量時,在實例化之前,成員變量分配的空間為0,在實例化時,如果成員變量未賦初值,則成員變量值會自動變為0Null
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public int i;
c# 類學習_初始化_06    
public string s;
c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        A a
=new A ();
c# 類學習_初始化_06        Console.WriteLine(
"i=",a.i);
c# 類學習_初始化_06        Console.WriteLine(
"s=",a.s);
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }
    
c# 類學習_初值_12 }

c# 類學習_初值
c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06 *結果為:
c# 類學習_初始化_06 * 0
c# 類學習_初始化_06 * NUll
c# 類學習_初值_12 
*/

c# 類學習_初值


3、類的重載

類的構造函數允許被重載,重載方法與方法重載一樣。
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public int i;
c# 類學習_初始化_06    
public string s;
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數1
c# 類學習_初始化_06
    public A(int i)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.i=i;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數2
c# 類學習_初始化_06
    public A(string s)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.s=s;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數3
c# 類學習_初始化_06
    public A(int i,string s)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.i=i;
c# 類學習_初始化_06        
this.s=s;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        A a
=new A();        
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值


4、類中This用法

    This是類中隱含的指針,類被實例化時,會將實例化後的對象的地址傳遞給變量。This不代表類本身,而是指類實例化後所產生的類的對象。
如上面代碼中


c# 類學習_初值如上面代碼中
c# 類學習_初值    
//重載構造函數1
c# 類學習_初值
    public A(int i)
c# 類學習_初始化_03c# 類學習_初值_04    
c# 類學習_整型_05{        
c# 類學習_初始化_06        
this.i=i;
c# 類學習_初值_12    }

c# 類學習_初值
//this.i=i,表示實例化後的a。
c# 類學習_初值
//this.i表示a中的i,而後邊的i表示形參i
c# 類學習_初值


5、類中重載構造函數調用無參構造函數

類中有成員變數時,如果成員變數賦了初值,這樣每次實例化時,都會被賦初值.這樣會造成代碼冗餘的問題.我們可以定義成員變量,在無參構造函數中賦初值,其他有參構造函數都調用無參構造函數.:this(),這樣無參函數就會先調用無參構造函數,然後在調用自己代碼。

如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public int i;
c# 類學習_初始化_06    
public string s;
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        i
=100;
c# 類學習_初始化_06        s
="string";
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數1
c# 類學習_初始化_06
    public A(int i):this()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.i=i;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數2
c# 類學習_初始化_06
    public A(string s):this()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.s=s;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初始化_06    
//重載構造函數3
c# 類學習_初始化_06
    public A(int i,string s):this()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        
this.i=i;
c# 類學習_初始化_06        
this.s=s;
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        A a
=new A();
c# 類學習_初始化_06        Console.WriteLine(
"我是第一個構造器函數產生的");
c# 類學習_初始化_06        Console.WriteLine(a.i);
c# 類學習_初始化_06        Console.WriteLine(a.s);
c# 類學習_初始化_06        
c# 類學習_初始化_06        A a1
=new A(1);
c# 類學習_初始化_06        Console.WriteLine(
"我是第二個構造器函數產生的");
c# 類學習_初始化_06        Console.WriteLine(a1.i);
c# 類學習_初始化_06        Console.WriteLine(a1.s);
c# 類學習_初始化_06        
c# 類學習_初始化_06        A a2
=new A("第三個構造器函數參數");
c# 類學習_初始化_06        Console.WriteLine(
"我是第三個構造器函數產生的");
c# 類學習_初始化_06        Console.WriteLine(a2.i);
c# 類學習_初始化_06        Console.WriteLine(a2.s);
c# 類學習_初始化_06        
c# 類學習_初始化_06        A a3
=new A(3,"第四個構造器函數參數");
c# 類學習_初始化_06        Console.WriteLine(
"我是第四個構造器函數產生的");
c# 類學習_初始化_06        Console.WriteLine(a3.i);
c# 類學習_初始化_06        Console.WriteLine(a3.s);
c# 類學習_初始化_06        
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06結果:
c# 類學習_初始化_06我是第一個構造器函數產生的
c# 類學習_初始化_06100
c# 類學習_初始化_06string
c# 類學習_初始化_06我是第二個構造器函數產生的
c# 類學習_初始化_061
c# 類學習_初始化_06string
c# 類學習_初始化_06我是第三個構造器函數產生的
c# 類學習_初始化_06100
c# 類學習_初始化_06第三個構造器函數參數
c# 類學習_初始化_06我是第四個構造器函數產生的
c# 類學習_初始化_063
c# 類學習_初始化_06第四個構造器函數參數
c# 類學習_初始化_06
c# 類學習_初值_12
*/

c# 類學習_初值


6、類的繼存

類的繼存用 ":被繼存的類 "的方式。當實例化繼存的類時,首先會執行父類的構造函數,然後在執行自己的構造函數。
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
//B繼存A,A為B的父類
c# 類學習_初值
class B:A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public B()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"B類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        B b
=new B();
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06結果為:
c# 類學習_初始化_06A類的無參構造函數
c# 類學習_初始化_06B類的無參構造函數
c# 類學習_初值_12
*/

c# 類學習_初值


7、類繼存注意問題

7.1父類A一定要有一個無參構造函數。如果類A沒有無參構造函數時,程式會出錯。
      7.2類在沒有有參構造函數時會自動生成無參構造函數,當有有參構造函數時,類就不會自動生成無參構造函數。
      7.3當類繼存時,父類要寫明無參構造函數。如下例中類B會自動調用父類A的無參構造函數。因為類會自動生成無參構造函數。即使類B沒有寫明無參構造函數,但會自動生成,他會尋找父類的無參構造函數。
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
public A(int i)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的一個整型參數構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
//B繼存A,A為B的父類
c# 類學習_初值
class B:A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public B()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"B類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
public B(int i)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"B類的一個整型參數構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        B b
=new B(100);
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初始化_03c# 類學習_初值_04
/**//*結果
c# 類學習_初始化_06 * A類的無參構造函數
c# 類學習_初始化_06 * B類的一個整型參數構造函數
c# 類學習_初值_12
*/

c# 類學習_初值


8
、指定構造函數

類中用“Base:執行父類”的方式指定的執行的構造函數
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
public A(int i)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的一個整型參數構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
//B繼存A,A為B的父類
c# 類學習_初值
class B:A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public B()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"B類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
//Base:執行父類指定的構造函數,此處只會執行類A的public A(int i)構造函數
c# 類學習_初始化_06
    public B(int i):base(50)
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"B類的一個整型參數構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        B b
=new B(100);
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06A類的一個整型參數構造函數
c# 類學習_初始化_06B類的一個整型參數構造函數
c# 類學習_初值_12
*/

c# 類學習_初值


9、靜態構造函數
    9.1靜態構造函數是實現對一個類進行初始化的方法。它一般用於對靜態資料的初始化。靜態構造函數不能有參數,不能有修飾符,而且不能被調用,當類被載入時,類的靜態構造函數自動被調用。
    9.2特點:
        在一個程式的執行過程中,靜態構造函數最多只執行一次
        靜態構造函數在類的靜態成員初始化之後執行。或者講編譯器會將靜態成員初始化語句轉換成賦值語句放在靜態構造函數執行的最開始。
        靜態構造函數在任何類的靜態成員被引用之前執行。
        靜態構造函數在任何類的實例變更被分配之前執行。
    9.3主要作用:
        對類的靜態成員作初始化
    9.4:注意
        如果類中定義了靜態變數並賦初值,則類會自動創建一個靜態構造函數,為這個變數賦初值。如果此變數沒有賦初值,則類就不會自動創建靜態構造函數。
        靜態構造函數在變數使用之前初載入。
如代碼:
c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public static int i=100;
c# 類學習_初始化_06    
static A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的靜態構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值
c# 類學習_初值
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(A.i);
c# 類學習_初始化_06        
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初始化_03c# 類學習_初值_04
/**//*
c# 類學習_初始化_06 * 結果為:
c# 類學習_初始化_06 * A類的靜態構造函數
c# 類學習_初始化_06 * 100
c# 類學習_初值_12 
*/

c# 類學習_初值
c# 類學習_初值

9.5 在一個程式的執行過程中,靜態構造函數最多只執行一次
如代碼:

c# 類學習_初值using System;
c# 類學習_初值
class A
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
public static int i=100;
c# 類學習_初始化_06    
static A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的靜態構造函數");
c# 類學習_初始化_11    }

c# 類學習_初始化_06    
public A()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        Console.WriteLine(
"A類的無參構造函數");
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初值 
class Test
c# 類學習_初始化_03c# 類學習_初值_04
c# 類學習_整型_05{
c# 類學習_初始化_06    
static void Main()
c# 類學習_学习_07c# 類學習_整型_08    
c# 類學習_整型_05{
c# 類學習_初始化_06        A a
=new A();
c# 類學習_初始化_06        
c# 類學習_初始化_06        A a1
=new A();
c# 類學習_初始化_06        Console.ReadLine();
c# 類學習_初始化_11    }

c# 類學習_初值_12}

c# 類學習_初始化_03c# 類學習_初值_04  
/**//* 結果為:
c# 類學習_初始化_06 * A類的靜態構造函數
c# 類學習_初始化_06 * A類的無參構造函數
c# 類學習_初始化_06 *
A類的無參構造函數
c# 類學習_初值_12 */c# 類學習_初值
c# 類學習_初值