---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
一、 類
1、 類的定義
C#使用class關鍵字來定義類
語法:
[訪問修飾符]class 類名
{
數據成員;
函數成員;
}
在C#中,訪問修飾符有四種:
public:可以在程序的任何地方訪問
internal:只能在本項目中被訪問。
private:只能在本類中被訪問
protected:只能在本類或子類中被訪問
在類這個級別,定義類時不指定訪問修飾符的情況下,默認爲internal;
而在類中定義變量或方法時不指定訪問修飾符,那麼默認爲private。
下面定義一個名叫Person的類,Person類包含兩個數據成員和一個成員方法:
public class Person
{
public string name;
public int age;
public Person() { }//無參構造函數
public Person(string Name,int Age)//有參構造函數
{
this.name = Name;
this.age = Age;
}
public void Hello(string Name, int Age)
{
Console.WriteLine("Hello,我叫{0},今年{1}歲了!", Name, Age);
}
}
class Program
{
static void Main(string[] args)
{
Person onePerson = new Person("張三",30);
onePerson.Hello();
Console.ReadKey();
}
}
輸出:
2、 類的實例化
定義好一個類之後,需要創建類的對象才能使用,通過類產生一個對象的過程,就叫類的實例化。C#中我們使用new關鍵字來創建類的實例(也叫做對象)。
實例化類的語法:
類名對象名 = new 類名();
如: Person lisi = new Person();
3、 加與不加static的區別
1) 不加static的方法又叫做實例方法,在調用之前必須先對類進行實例化,也就是創建一個類的對象,然後通過實例名.方法名 來訪問。
2) 加了static的方法叫靜態方法,它是屬於類本身的而不是屬於類的對象的,調用的時候不需要對類進行實例化,也就是說不需要創建類的實例,直接通過類名.方法名 來調用。
3) 使用原則:
靜態方法只能訪問類的靜態變量,不能訪問類的非靜態變量;
靜態方法只能使用類名來調用,不能使用實例來調用。
非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;
非靜態方法必須通過類的實例來調用。
例: static void Main(string[] args)
{
Test.CNGreet();//通過“類名.方法名”來調用靜態方法
Test instance=newTest();//創建類的一個對象instance
instance.EnglishGreet();//通過“實例名.方法名”來調用非靜態方法
Console.ReadKey();
}
class Test
{
static string Sname="Jack";//靜態變量
string name="Lily";//非靜態變量
///<summary>
///非靜態方法EnglishGreet()
///</summary>
public void EnglishGreet()
{
//非靜態方法即可以訪問靜態成員又可以訪問非靜態成員
Console.WriteLine("How are you ?{0} , {1}", Sname, name);
}
///<summary>
///靜態方法CNGreet()
///</summary>
public static void CNGreet()
{
//靜態方法只能訪問靜態方法
Console.WriteLine("你好呀?,{0}!", Sname);
}
}
輸出:
二、 構造函數
C#中的構造函數是一種特殊的成員函數,它主要用於爲對象分配存儲空間,對數據成員進行初始化。
C#中的構造函數有以下主要特點:
(1) C#構造函數的名字必須與類名相同;
(2) C#構造函數沒有返回類型,它可以帶參數也可以不帶參數;
(3) C#構造函數主要作用是完成對類的初始化的工作;
(4) 在創建一個類的新對象(使用new關鍵字)時,系統會自動調用構造函數初始化新對象;
(5) 當我們定義一個類之後,如果我們沒有寫構造函數,系統會爲我們自動添加一個默認的構造函數。一旦我們自己定義了一個構造函數,系統就不會再爲我們添加那個無參的構造函數了,所以此時最好自己手動再寫一個無參的構造函數,以方便使用。
(6) 利用 :this() 和 :base(),構造函數可以調用其他構造函數。
靜態構造函數只能對靜態數據成員進行初始化,而不能對非靜態數據成員進行初始化;非靜態構造函數既可以對靜態數據成員賦值,也可以對非靜態數據成員進行初始化。
三、 類的繼承中構造函數的調用問題
派生類對象的初始化是由基類和派生類共同完成的。當創建派生類的對象時,系統將會調用基類的構造函數和派生類的構造函數,構造函數的執行次序是:先執行基類的構造函數,再執行派生類的構造函數。至於執行基類的哪個構造函數,缺省情況下是執行基類的無參構造函數,如果要執行基類的有參構造函數,則必須在派生類構造函數的成員初始化列表中指出。
例: static void Main(string[] args)
{
B objB0 = new B("Class B");
B objB1 = new B("Class A", "Class B");
Console.ReadKey();
}
public class A
{
public A() //無參構造函數
{
Console.WriteLine("Non Parameter!");
}
public A(string str)
{
Console.WriteLine(str);
}
}
public class B:A //B類繼承自A類
{
public B(string strB):base() //先調用基類A中無參構造函數,再調用B類含一個參數的構造函數
{
Console.WriteLine(strB);
}
public B(string strA,string strB):base(strA) //先調用基類A中含一個參數的構造函數,再調用B類含兩個參數的構造函數
{
Console.WriteLine(strB);
}
}
輸出:---------------------- ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! ----------------------
詳細請查看:http://edu.csdn.net