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