園友們大家好,今天繼續和大家一起探討一下C#語言中的面向對象特性之一---封裝
在C#語言中面向對象有三個特性封裝、繼承、多態。我們首先來簡單的理解一下面向對象,所謂面向對象就是應用程序開發中的技巧和概念,主要就是一種設計的思路,簡稱OOP技術,面向對象的編程語言可以使得復雜的工作條理變的清晰,編寫起來也就容易些,它還具有重用性、靈活性和擴展性。但是,說實話如果具體說面向對象還真說不清楚,就好比你問我什麼是數學。
No.1 面向對象的基礎核心是類和對象。所謂類就是具有相同屬性和行為的對象的集合。比如說:導演是個類,演員是個類,觀眾也是一個類,他們都有相同的屬性和行為,都是抽象類,都是指一群人。所謂對象就是一切皆為對象,比如說:一台電腦、一個手機、一個蘋果等等都是對象。對象描述了一個物體的特性,抽象一個實際的物體或一個方法。
為了加深印象,我給大家畫了一張圖:
在對象中它的訪問修飾符有四個:public公有權限、internal程序集保護權限、protected保護權限、private私有權限。類的成員也包括三個:字段、屬性、方法。字段是保存類的信息數據,大部分字段是私有的。屬性是為了保護私有字段,是公有的,其中屬性包括兩個訪問器一個是只讀屬性get訪問器和只寫屬性set訪問器。方法是類的行為,就是類要做的事情。
No.2 簡單的了解了面向對象,接下來我們就來看一下方法的定義,所謂方法就是行為,也就是要干什麼事情,對於方法的定義也沒有具體的說法,比較廣泛,一般就是指為了達到某種目的為了獲得某種東西而采取的一種手段或者行為方式。
我們來下一個簡單的方法調用的例子:
創建類:
1 class Regisseur //演員類
2 {
3 string name;
4 public string Name
5 {
6 get { return name; }
7 set { name = value; }
8 }
9 //選擇電影名稱的方法,參數movieName是電影名稱
10 public void SelectMovieName(string movieName)
11 {
12 Console.WriteLine("導演:" + name + "拍攝" + movieName + "精彩電影");
13 }
14 }
在Main方法中調用類的方法:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 Regisseur r = new Regisseur();//實例化對象
6 r.Name = "徐克";//調用屬性賦值
7 r.SelectMovieName("《龍門飛甲》");//調用方法選電影名稱
8 Console.ReadKey();
9 }
10 }
運行結果:
來看一下定義類的方法的語法:
訪問修飾符 返回類型 方法名(參數列表)
{
方法主體;
}
我來簡單的解釋一下,這個返回類型就是數據類型,表示調用完這個方法之後可以得到一個值。如果不返回值得話,那麼這個類型就是void,
比如:private string Qingpingguo(string n) 返回字符串 返回值用關鍵字“return” 返回
public void Qingpingguo(string n)不返回任何值
方法名就是給方法取個名稱,要注意的是在取名字的時候第一個字母要大寫。
參數列表就是在調用方法的時候可以通過參數給方法傳遞數據,方法根據不同的參數產生不同的結果。
不如:private string Qingpingguo(string n)參數是一個,字符串類型
private void Qingpingguo(int i,string n)參數兩個,int 和字符串
方法的主體就是這個方法要做的功能。
No.3 在方法的定義中有一種方法叫靜態方法,靜態方法就是可以不用實例化對象,然後直接調用,語法如下:
訪問修飾符 static 返回類型 方法名(參數列表)
{
方法主體
}
靜態方法相比普通方法來說比較簡單,尤其是在調用的時候,雖然結果都是一樣的,但是,我不推薦大家用靜態方法,為什麼?因為被static關鍵字修飾的靜態的屬性和方法都是在程序開始運行的時候就創建了,一直到程序結束才消失,它浪費了很多的資源,所以希望大家在沒有必要的情況下還是不要用靜態方法。
No.4 方法的重載
方法的重載就是方法的名稱相同,方法的參數類型不同或者參數的數量不同
例子:
1 class Regisseur
2 {
3 public void Qingpingguo(string title, string player)//兩個參數
4 {
5 Console.WriteLine("電影名字:" + title);
6 Console.WriteLine("主演:" + player);
7 }
8 public void Qingpingguo(string title, string player, string player1)//三個參數
9 {
10 Console.WriteLine("電影名字:" + title);
11 Console.WriteLine("主演:" + player+"和"+player1);
12 }
13 }
在Main方法中調用重載方法
1 static void Main(string[] args)
2 {
3 Regisseur r = new Regisseur();//實例化對象
4 r.Qingpingguo("《龍門飛甲》", "李連傑");//調用兩個參數的方法
5 r.Qingpingguo("《龍門飛甲》", "李連傑","周迅");//重載方法,調用三個參數的方法
6 Console.ReadKey();
7 }
8
運行結果:
這個方法的重載比較簡單,我也就不做過多說明了,要注意一點的是方法的返回類型不同不叫做重載。
No.5 構造方法
構造方法的作用就是在實例化對象時可以給屬性賦值,這樣可以簡單化我們的代碼,它的特殊之處就是方法名稱和類名相同,並且沒有返回類型,而且構造方法一般用public訪問修飾符。如果類裡面沒有定義好的構造方法,在編譯器裡會自動創建一個無參數的構造方法,這個構造方法就好似隱式構造方法,我們自己寫的那個方法叫顯式構造方法,在隱式構造方法中編譯器會自動給字段賦值。對於構造方法相對比較簡單一些,我們就不深究了。
No.6 參數傳遞
參數的傳遞分為,值傳遞和引用傳遞,對於值傳遞我想大家一看字面意思就會明白的。所以還是直接逃到引用傳遞吧!
在引用傳遞我們要注意一個關鍵字“ref”在定義方法時,引用傳遞的參數前必須加關鍵字ref,比如:static string qingpingguo(ref string name){} 還有就是在傳遞參數前必須賦值。我們來看一下:
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 string n = "";
6 string m=qingpingguo(ref n);//調用方法值傳遞
7 Console.WriteLine(m);//輸出返回值
8 Console.WriteLine("博客園裡有"+n);//輸出參數的值
9 Console.ReadKey();
10 }
11 static string qingpingguo(ref string name)
12 {
13 name="青蘋果";
14 Console.WriteLine("我喜歡青蘋果");
15 return "返回";
16 }
17 }
運行結果:
在這裡要注意的是值傳遞傳遞的是參數的復制品,不是它本身;引用傳遞傳遞的是參數本身。在剛才我們所說的關鍵字ref,還有一個是和它對應的就是out,當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。 若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。簡單的說他們兩個的區別是ref要求參數在傳遞給函數前要初始化,而out就不需要,out是在方法中對其完成初始化,它是常見於平台調用中。out適用在需要return多個返回值得地方,而ref則用在需要被調用的方法修改調用者的引用的時候。
總結:1.面向對象的類和方法;
2.方法的定義;
3.靜態方法;
4.方法的重載;
5.構造方法;
6.參數傳遞;
The end!
此文是本人的個人觀點,如有不完善或者不准確的地方,歡迎高手進行批評,老鳥進行指點。